2008-11-17 5 views
9

In System.ComponentModel gibt es eine Klasse namens CancelEventArgs, die ein Cancel-Member enthält, das in Ereignislistenern festgelegt werden kann. In der Dokumentation zu MSDN wird erläutert, wie Sie Ereignisse aus einem Listener abbrechen können, aber wie kann ich diese verwenden, um meine eigenen abbrechbaren Ereignisse zu implementieren? Gibt es eine Möglichkeit, das Cancel-Mitglied zu überprüfen, nachdem jeder Listener ausgelöst wurde, oder muss ich warten, bis das Ereignis alle seine Listener ausgelöst hat?Wie implementiere ich ein abbrechbares Ereignis?

Antwort

16

jeden Zuhörer wiederum zu überprüfen, müssen Sie die Handler über GetInvocationList manuell erhalten:

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

Während dieser Code funktioniert, ist, dass der normale Betrieb eines CancelEventHandler? Werden sie normalerweise nicht in einem BeforeX-, AfterX-Muster verwendet, wo wenn irgendetwas in Before Canel setzt, dann passiert X nicht, also wird AfterX nicht aufgerufen. Warum ist es wichtig, zu verhindern, dass andere Listener das Before-Ereignis erhalten? –

+0

Ich möchte auch die Antwort auf den obigen Kommentar darüber wissen, warum es wichtig ist, andere Listener zu stoppen, die das Before-Ereignis erhalten. – MPavlak

+3

Stellen Sie sich zwei Abonnenten für dasselbe Ereignis vor (im selben Objekt). Einer setzt 'cancel = true' und der zweite" cancel = false ". Was denkst du würde passieren? Die Antwort zeigt, wie man eine solche Situation vermeiden kann. Wenn mindestens ein Teilnehmer das Ereignis absagt, wird es abgebrochen. Zeitraum. – Joel

Verwandte Themen