如何调用所有事件处理程序并发绑定到事件

时间:2014-03-07 11:56:53

标签: c# .net events delegates task-parallel-library

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

我的问题是:

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

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

2 个答案:

答案 0 :(得分:2)

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

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


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

答案 1 :(得分:0)

您的意思是获取调用列表吗?

var handler = MyHandler;
if (handler != null)
{
    var invocationList = handler.GetInvocationList();
    foreach (EventHandler receiver in invocationList)
        receiver.BeginInvoke(this, EventArgs.Empty, null, null);
}

您可以使用围绕该代码块的lock(_myLock)语句来锁定调用。