几天前,我遇到了一个问题:如何调用所有事件处理程序并行绑定到事件。
我的问题是:
如何获取绑定到事件的所有事件处理程序的列表?
虽然我将调用所有事件处理程序,但没有人应该能够为该事件添加新的事件处理程序。所以,基本上我需要在调用事件处理程序时获取锁定。那么,如何在c#中解决这个问题?
答案 0 :(得分:2)
要获取绑定到事件的所有侦听器的列表,请使用GetInvocationList
由于委托是不可变的,您所要做的就是获取对委托本身的引用。如果有人向共享事件添加了一个侦听器,则会创建一个新的侦听器 - 并且您正在迭代的那个将保持不变。无需锁定。
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)
语句来锁定调用。