2009-04-19 4 views
1

Ähnlich wie bei den KeyPress-Ereignissen möchte ich, dass derjenige, der das Ereignis abonniert hat, e.Handled in meiner EventArgs-Klasse festlegen kann. Wenn sie wahr werden, will ich nicht mehr weiter feuern. Irgendwelche Ideen, wie man das umsetzt? Gerade jetzt, hier ist meine Methode:Wie kann ich die Verarbeitung weiterer Ereignisse stoppen?

protected void OnDataReceived(SocketAsyncEventArgs e) 
{ 
    if (DataReceived != null) 
    {     
     DataReceived(this, e); 
    } 
} 

Von meinem Verständnis, alle, die auf das Ereignis abonniert wird Benachrichtigung erhalten, so Einstellung e.Handled = true; wird hier keine Wirkung haben.

+0

Ich glaube, Sie haben von dem Hörer Muster in diesem Fall gefangen. Beherrschen Sie den gesamten Code? – ojblass

+0

Im Moment habe ich die Kontrolle über den gesamten Code, aber da ich ein Plugin-Modell implementiere, werde ich das vielleicht in Zukunft nicht tun. Im Wesentlichen habe ich ein Ereignis, und das erste Plugin, um dieses Ereignis zu behandeln, ich möchte nicht, dass andere Plugins irgendeine zusätzliche Verarbeitung darauf durchführen. Einige Ereignisse, die ich mache. – esac

Antwort

4

Beispielcode für eine Lösung mit Delegate.GetInvocationList:

public class MyEventArgs : EventArgs 
{ 
    public bool Handled { get; set; } 
} 

public class SomeClass 
{ 
    public event EventHandler<MyEventArgs> SomeEvent; 

    protected virtual void OnSomeEvent(MyEventArgs e) 
    { 
     var listeners = SomeEvent.GetInvocationList(); 
     foreach (var listener in listeners) 
     { 
      if (e.Handled) break; 
      ((EventHandler<MyEventArgs>)listener).Invoke(this, e); 
     } 
    } 
}