2008-11-17 7 views
9

Dans System.ComponentModel, une classe appelée CancelEventArgs contient un membre Cancel pouvant être défini dans les écouteurs d'événement. La documentation sur MSDN explique comment l'utiliser pour annuler des événements depuis un écouteur, mais comment l'utiliser pour implémenter mes propres événements annulables? Existe-t-il un moyen de vérifier le membre Annuler après que chaque écouteur se déclenche ou dois-je attendre jusqu'à ce que l'événement ait renvoyé tous ses écouteurs?Comment implémenter un événement annulable?

Répondre

16

Pour vérifier chaque auditeur à son tour, vous devez obtenir manuellement les gestionnaires via GetInvocationList:

class Foo 
{ 
    public event CancelEventHandler Bar; 

    protected void OnBar() 
    { 
     bool cancel = false; 
     CancelEventHandler handler = Bar; 
     if (handler != null) 
     { 
      CancelEventArgs args = new CancelEventArgs(cancel); 
      foreach (CancelEventHandler tmp in handler.GetInvocationList()) 
      { 
       tmp(this, args); 
       if (args.Cancel) 
       { 
        cancel = true; 
        break; 
       } 
      } 
     } 
     if(!cancel) { /* ... */ } 
    } 
} 
+5

Alors que ce code fonctionne, est que le fonctionnement normal d'un CancelEventHandler? Ne sont-ils pas habituellement utilisés dans un pattern BeforeX, AfterX, où si quelque chose dans Before définit Canel, alors X ne se produit pas alors AfterX n'est pas appelé. Pourquoi est-il important d'empêcher les autres auditeurs d'avoir l'événement Avant? –

+0

Je voudrais également connaître la réponse au commentaire ci-dessus sur les raisons pour lesquelles il est important d'empêcher les autres auditeurs d'obtenir l'événement Avant. – MPavlak

+3

Imaginez deux abonnés au même événement (dans le même objet). L'un définit 'cancel = true' et l'autre 'cancel = false'. Selon vous, que se passerait-il? La réponse montre comment éviter une telle situation. Si au moins un abonné annule l'événement, il est annulé. Période. – Joel

Questions connexes