【问题标题】:C# Know how many EventHandlers are set?C#知道设置了多少个EventHandlers?
【发布时间】:2016-04-14 04:35:30
【问题描述】:

众所周知,我们可以创建一个 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,所有其他方法也将自动删除。

我相信会的,但我只是想与各位专家确认一下。在谷歌搜索时,我没有得到我要求的令人满意的答案。

如有错误请指正。

【问题讨论】:

    标签: c# events event-handling


    【解决方案1】:

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

    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(只要您在声明事件的类中)。

    【讨论】:

    • OR 也可以做一个 for 循环和 MyEvent -= HandlerMethod(我们使用 += 的那个),对。并使 MyEvent = null。这两个选项可以解决我的查询。我对吗。不善于与代表相处,在 tiems 中感到困惑。所以我要求确认。
    • 通过将标识符 x 更改为 MyEvent 来纠正代码中的错误
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您所描述的是一个类似场的事件。它与普通事件声明相同,除了没有正文。

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

      请参阅Jon Skeet on events 的回答。

      【讨论】:

        猜你喜欢
        • 2015-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 1970-01-01
        • 2014-12-05
        相关资源
        最近更新 更多