在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(); }
引发事件的对象不应允许其侦听器修改事件调用列表。 每个事件侦听器都应仅订阅或取消订阅自己的事件处理程序。
最好在对象初始化时设置事件处理程序,即在构造函数中。