在C#中清除或检查事件处理程序

我有一些C#代码可以更新对象的某些属性。 我定义了一个事件处理程序,以帮助我在更新过程完成时做出响应。 不幸的是,我已经了解到这个事件被多次解雇了。 我怀疑这种情况正在发生,因为事件处理程序正在错误的时间设置。 目前,它的设置如下:

myObject.Update_Succeeded += new EventHandler(myObject_Update_Succeeded); 

由于代码的复杂性,我很难跟踪它应该设置的位置。 我想只设置它之前没有设置的事件处理程序。 因此,我想做这样的事情:

 ClearEventHandlers(myObject); 

要么

 myObject.Update_Succeeded = null; myObject.Update_Succeeded += new EventHandler(myObject_Update_Succeeded); 

有没有办法完成我正在尝试的东西?

谢谢!

您应该能够使用减法运算符删除处理程序,如下所示

 myObject.Update_Succeeded -= new EventHandler(myObject_Update_Succeeded); 

或者如果您有疑问,请检查一下删除所有事件处理程序的方法

如何从控件中删除所有事件处理程序

是的,您可以自定义事件的添加/删除访问者。 本文介绍了这些访问器。 但你可以这样做:

 class MyClass { private EventHandler _myEvent; public event EventHandler MyEvent { [MethodImpl(MethodImplOptions.Synchronized)] add { _myEvent = (EventHandler)Delegate.Combine(_myEvent, value); } [MethodImpl(MethodImplOptions.Synchronized)] remove { _myEvent = (EventHandler)Delegate.Remove(_myEvent, value); } } public void ClearMyEvent() { _myEvent = null; } ... } 

正确的方法应该是在您不再使用它之后从每个事件中分离处理程序:

 public class MyObjectListener { private readonly MyObject _object; public class MyObjectListener(MyObject obj) { _object = obj; Attach(); } // adds event handlers private void Attach() { obj.UpdateSucceeded += UpdateSuceededHandler; obj.UpdateFailed += UpdateFailedHandler; } // removes event handlers private void Detach() { obj.UpdateSucceeded -= UpdateSuceededHandler; obj.UpdateFailed -= UpdateFailedHandler; } ... } 

您唯一需要决定的是调用Detach方法的位置。 例如,您可以在处理程序本身中调用它:

  private void UpdateSuceededHandler(object sender, Data args) { Detach(); // do something when it succeeds } private void UpdateFailedHandler(object sender, Data args) { Detach(); // do something when it fails } 

或者,您可以允许MyObjectListener用户告诉它不再需要侦听附加的对象:

  public void StopListening() { Detach(); } 

引发事件的对象不应允许其侦听器修改事件调用列表。 每个事件侦听器都应仅订阅或取消订阅自己的事件处理程序。

最好在对象初始化时设置事件处理程序,即在构造函数中。