2009-03-02 9 views
3

CancelEventArgs bietet eine gerufene Objekt Abbrechen, dass verschiedene Event-Handler festlegen können, das Objekt zu sagen, dass das Ereignis aufgerufen, ob sie weiterhin die Ausführung der Aktion abbrechen sollte.Handlers

Da es sich bei Ereignissen um Multicastdelegaten handelt, scheint eine einfache Erhöhung des Ereignisses zwei Delegaten aufzurufen. Der erste legt die Cancel-Eigenschaft auf True fest, der zweite legt die Cancel-Eigenschaft auf false fest. Unterstützen "cancelable" -Ereignisse von Komponenten/Rahmen diese Szenarios und rufen jeden Delegierten nacheinander auf, wobei er das Löschkennzeichen bei jedem Schritt prüft? Was ist die beste Vorgehensweise, um diese Art von Ereignissen zu veranstalten? Wird nur eine Instanz von CancelEventArgs an jeden Delegaten übergeben? Werden separate Instanzen verwendet?

Antwort

2

Ein kleines Experiment zeigt schnell, dass sie 1 Instanz von Cancel (wahrscheinlich des EventArgs-Objekts) verwenden.

Das macht es ein bisschen ein Glücksspiel, mit dem Ergebnis abhängig von der Reihenfolge, in der die Eventhandler angehängt wurden.

Im besonderen Fall des CancelEventArgs ich glaube, das richtige Muster zu wahren oder lassen sie allein Abbrechen gesetzt wäre, so spielt die Reihenfolge nicht.

1

Geprüft:

public static void Main() { 
    Event += (sender, e) => e.Cancel = true; 
    Event += (sender, e) => e.Cancel = false; 
    Event += (sender, e) => e.Cancel = true; 

    var args = new CancelEventArgs(); 
    Event(null, args); 

    WL(args.Cancel); 
} 

static event EventHandler<CancelEventArgs> Event; 

Die Reihenfolge der beigefügten Event-Handler nicht egal.

Generell Ereignisse mit nicht unveränderbar Ereignisse args und Multicastdelegaten verwendet werden, sollten nicht zusammen, aber das .NET-Framework verwendet sehr umfangreich solche Ereignisse.

Verwandte Themen