C#知道设置了多少个EventHandler?

时间:2011-06-22 12:14:40

标签: c# events event-handling

众所周知,我们可以创建一个EventHandler并向其添加N次方法。像:

   // Declare and EventHandler     
   public event EventHandler InternetConnectionAvailableEvent;
    private void OnInternetConnectionAvailableEvent()
    {
        if (InternetConnectionAvailableEvent != null)
        {
            EventHandler handle = InternetConnectionAvailableEvent;

            EventArgs e = EventArgs.Empty;
            handle(this, e);
        }
    }


   // IN OTHER CLASS WHERE I USE THE EVENT
   // Set the method name to handle the event    
   monitorInternet.InternetConnectionAvailableEvent += HandleInternetConnectionEvent;

    void HandleInternetConnectionEvent(object sender, EventArgs e)
    {
        if (syncContext != null)
        {
            MonitorInternetConnection mic = (MonitorInternetConnection)sender;
            if (mic != null)
            {
                syncContext.Post(o => InternetConnected(), null);
            }
        }
    }

   // To remove
   monitorInternet.InternetConnectionAvailableEvent -= null; 

更新:

   // To remove it should be 
   monitorInternet.InternetConnectionAvailableEvent -= HandleInternetConnectionEvent;  // CORRECT

可以多次调用相同的方法而不删除它。

如果我monitorInternet.InternetConnectionAvailableEvent -= null;,则删除所有事件处理程序。我的意思是如果设置2-3次,并且只删除一次,通过使其为null,也将自动删除所有其他方法。

我相信会的,但我只是想和你的专家确认一下。谷歌搜索时,我没有得到我所要求的满意答案。

如果我错了,请纠正我。

3 个答案:

答案 0 :(得分:12)

要查找事件处理程序的数量,您可以使用以下代码:

InternetConnectionAvailableEvent.GetInvocationList().Length;

以下代码演示MyEvent -= null未清除处理程序列表。

public static event EventHandler MyEvent;

[STAThread]
static void Main()
{
   MyEvent += (s,dea) => 1.ToString();
   MyEvent -= null;

   Console.WriteLine(MyEvent.GetInvocationList().Length);
   // Prints 1
   MyEvent = null;
   Console.WriteLine(MyEvent == null);
   // Prints true
}

要清除列表(这可能永远不是一个好主意),您可以将事件设置为null(只要您在声明事件的类中)。

答案 1 :(得分:4)

通过相等性删除委托,因此您不会从调用列表中删除任何内容,因为调用列表中的任何内容都不是null

答案 2 :(得分:4)

你所描述的是类似田野的事件。它与速记事件声明相同,除了没有正文。

从类内部,您可以将事件设置为null。从课堂外你不能这样做。事件遵循订阅和取消订阅方法。在类中,您引用变量,在引用事件的类之外。

Jon Skeet on events查看此答案。