C# 如何同时调用绑定到事件的所有事件处理程序

C# 如何同时调用绑定到事件的所有事件处理程序,c#,.net,events,delegates,task-parallel-library,C#,.net,Events,Delegates,Task Parallel Library,几天前,我遇到了一个问题:如何并行调用所有事件处理程序绑定到一个事件 我的问题是: 如何获取绑定到事件的所有事件处理程序的列表 虽然我将调用所有事件处理程序,但没有人能够向该事件添加新的事件处理程序。所以,基本上我需要在调用事件处理程序时获取锁。那么,如何在c#中解决这个问题呢 你是说获取调用列表吗 var handler = MyHandler; if (handler != null) { var invocationList = handler.GetInvocationList(

几天前,我遇到了一个问题:如何并行调用所有事件处理程序绑定到一个事件

我的问题是:

  • 如何获取绑定到事件的所有事件处理程序的列表

  • 虽然我将调用所有事件处理程序,但没有人能够向该事件添加新的事件处理程序。所以,基本上我需要在调用事件处理程序时获取锁。那么,如何在c#中解决这个问题呢


  • 你是说获取调用列表吗

    var handler = MyHandler;
    if (handler != null)
    {
        var invocationList = handler.GetInvocationList();
        foreach (EventHandler receiver in invocationList)
            receiver.BeginInvoke(this, EventArgs.Empty, null, null);
    }
    
    您可以简单地通过在该代码块周围使用
    lock(\u myLock)
    语句来锁定调用

  • 要获取绑定到事件的所有侦听器的列表,请使用
    GetInvocationList

  • 由于委托是不可变的,所以您所要做的就是获取对委托本身的引用。如果有人向共享事件添加了一个侦听器,那么将创建一个新的侦听器,而您正在迭代的侦听器将保持不变。不需要锁


  • EventHandler handler = OnEvent;
    if (handler != null)
    {
        Parallel.ForEach(handler.GetInvocationList(),
            del => del.DynamicInvoke(this, EventArgs.Empty));
    }