J'utilise une API basée sur les événements et je souhaite qu'une seule méthode de gestion des événements soit appelée une seule fois. (Notez que j'ai une autre méthode qui gère toujours l'événement, mais je veux ajouter un autre gestionnaire pour certaines situations et ne l'exécuter qu'une fois.)Comment lever un événement (en particulier avec un gestionnaire anonyme) une seule fois dans .NET?
Est-il possible/encouragé de se désabonner d'un événement dans le gestionnaire d'événements ? Par exemple.
private void OnEventRaised(object sender, EventArgs e) {
_eventRaisingObject.EventRaised -= OnEventRaised;
... // Do normal code
}
De quel type de problèmes d'interconnexion dois-je m'inquiéter dans cette approche?
Deuxièmement, est-il possible d'appeler le gestionnaire d'événements une seule fois lorsqu'il s'agit d'une méthode anonyme? Par exemple.
_eventRaisingObject.EventRaised += (sender, e) => {
// Unsubscribe?
... // Do normal code
}
Actuellement, je suis en utilisant une méthode anonyme et en vérifiant simplement un booléen, mais je pense que ce serait mieux (moins les frais généraux et les éventuels bugs) pour résilier votre abonnement lorsque le travail est fait - cette hypothèse est peut-être incorrecte. Un problème que je prévois avec la vérification d'un booléen est que, si la situation doit être répétée (pour que le gestionnaire d'événements anonymes soit à nouveau ajouté), le booléen partagé pourrait permettre aux méthodes anonymes d'être appelées plusieurs fois sur différents threads.
Pourriez-vous ajouter un contexte au problème que vous essayez de résoudre? Je ne peux pas m'empêcher de penser qu'un modèle autre que l'abonnement à un événement pourrait mieux répondre à la facture. –
@AdamRalph: Le contexte reçoit des paquets Ethernet et les analyse, mais a besoin d'analyser le paquet suivant avec une logique supplémentaire en de rares occasions. Peut-être qu'un autre modèle conviendrait mieux, mais je n'ai accès qu'aux événements soulevés par l'objet. Je ne veux pas avoir une machine d'état dans mon code d'analyse de paquets simplement pour traiter ce cas rare. – Pat