清除或检查c#中的事件处理程序

本文关键字:事件处理 程序 检查 清除 | 更新日期: 2023-09-27 18:04:29

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

myObject.Update_Succeeded += new EventHandler(myObject_Update_Succeeded);

由于代码的复杂性,我很难确定应该在哪里设置。我想只设置之前没有设置的事件处理程序。因此,我想这样做:

ClearEventHandlers(myObject);

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

有办法完成我正在尝试的事情吗?

谢谢!

清除或检查c#中的事件处理程序

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

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;
    }
    ...
}

您应该能够使用下面的减法操作符删除处理程序

myObject.Update_Succeeded -= new EventHandler(myObject_Update_Succeeded);

或者,如果你不确定,请查看此选项以删除所有事件处理程序

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

正确的方法应该是在不再使用事件处理程序后将其从每个事件中分离出来:

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();
     }

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

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