2009-04-19 3 views
1

Как и события KeyPress, я хочу, чтобы кто-либо подписался на это событие, чтобы установить e.Handled в моем классе EventArgs. Если они вернутся, я больше не хочу продолжать стрельбу. Есть идеи, как это реализовать? Прямо сейчас, вот мой метод:Как прекратить обработку дальнейших событий

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

В моем понимании, все, кто подписался на событие получит уведомление, поэтому установка e.Handled = истина; здесь не будет никакого эффекта.

+0

Я думаю, что вы оказались в ловушке паттерном слушающего в данном случае. Вы контролируете весь код? – ojblass

+0

Прямо сейчас у меня есть контроль над всем кодом, но поскольку я реализую модель плагина, я не могу в будущем. По сути, у меня есть событие и первый плагин для обработки этого события, я не хочу, чтобы другие плагины выполняли какую-либо дополнительную обработку. Некоторые события я делаю. – esac

ответ

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); 
     } 
    } 
} 
Смежные вопросы