如何停止处理其他事件

时间:2009-04-19 07:38:53

标签: c# events event-handling invoke

与KeyPress事件类似,我希望订阅该事件的任何人能够在我的EventArgs类中设置e.Handled。如果它们返回true,我不再想继续发射事件。任何想法如何实现这一点?现在,这是我的方法:

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

根据我的理解,订阅该活动的每个人都会收到通知,因此设置e.Handled = true;这里没有任何效果。

1 个答案:

答案 0 :(得分:4)

使用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);
        }
    }
}