Si vous parlez d'un événement sur une classe pour laquelle vous avez accès à la source, vous pouvez placer le garde dans la définition de l'événement.
private bool _eventHasSubscribers = false;
private EventHandler<MyDelegateType> _myEvent;
public event EventHandler<MyDelegateType> MyEvent
{
add
{
if (_myEvent == null)
{
_myEvent += value;
}
}
remove
{
_myEvent -= value;
}
}
Cela garantirait qu'un seul abonné peut s'abonner à l'événement sur cette instance de la classe qui fournit l'événement.
EDIT S'il vous plaît voir les commentaires sur pourquoi le code ci-dessus est une mauvaise idée et non thread thread
Si votre problème est qu'une seule instance du client s'abonne plusieurs fois (et que vous avez besoin de plusieurs abonnés), alors le code client devra gérer cela. Donc, remplacer
pas déjà inscrit
avec un membre bool de la classe client qui obtient l'ensemble lorsque vous vous abonnez pour l'événement la première fois.
Modifier (après acceptée): D'après le commentaire de @Glen T (l'émetteur de la question) le code de la solution retenue, il est allé avec est dans la classe client:
if (alreadySubscribedFlag)
{
member.Event += new MemeberClass.Delegate(handler);
}
Où alreadySubscribedFlag est une variable membre de la classe client qui suit le premier abonnement à l'événement spécifique. Les gens qui regardent le premier extrait de code ici, s'il vous plaît prendre note du commentaire @ Rune - ce n'est pas une bonne idée de changer le comportement de l'abonnement à un événement d'une manière non évidente.
EDIT 31/7/2009: Veuillez vous référer aux commentaires de @Sam Saffron. Comme je l'ai déjà dit et Sam admet que la première méthode présentée ici n'est pas un moyen sensé de modifier le comportement de l'abonnement à l'événement. Les consommateurs de la classe doivent connaître sa mise en œuvre interne pour comprendre son comportement. Pas très gentil.
@Sam Saffron commente également la sécurité des threads. Je suppose qu'il fait référence à la condition de concurrence possible où deux abonnés (proches de) tentent simultanément de s'abonner et ils peuvent tous les deux finir par s'abonner. Un verrou pourrait être utilisé pour améliorer cela. Si vous envisagez de changer le mode de fonctionnement de l'abonnement à l'événement, je vous conseille de read about how to make the subscription add/remove properties thread safe.
Je pense que je vais aller de l'avant avec l'approche variable booléenne. Cependant, je suis un peu surpris qu'il n'y ait pas un autre moyen de vérifier si un client est déjà inscrit. J'aurais pensé qu'il était plus commun pour un client donné de vouloir seulement s'abonner une fois? –
Selon votre configuration, vous pouvez lancer une exception si l'événement a déjà un abonné. Si vous ajoutez des abonnés à l'exécution, cela les avertira de l'erreur au lieu de ne rien faire. Changer le comportement par défaut sans avertir l'utilisateur n'est pas la meilleure pratique. –
Ceci n'est pas sûr pour le multithreading. –