几天前我遇到了一个问题,即如何调用所有事件处理程序并行绑定到一个事件。如何同时调用所有事件处理程序绑定到事件
我的问题是:
如何获得绑定到一个事件的所有事件处理程序的列表?
虽然我会调用所有事件处理程序,但没有人应该能够为该事件添加新的事件处理程序。所以,基本上我需要在我调用事件处理程序时获取锁定。那么,如何在c#中解决这个问题呢?
几天前我遇到了一个问题,即如何调用所有事件处理程序并行绑定到一个事件。如何同时调用所有事件处理程序绑定到事件
我的问题是:
如何获得绑定到一个事件的所有事件处理程序的列表?
虽然我会调用所有事件处理程序,但没有人应该能够为该事件添加新的事件处理程序。所以,基本上我需要在我调用事件处理程序时获取锁定。那么,如何在c#中解决这个问题呢?
您的意思是获取调用列表吗?
var handler = MyHandler;
if (handler != null)
{
var invocationList = handler.GetInvocationList();
foreach (EventHandler receiver in invocationList)
receiver.BeginInvoke(this, EventArgs.Empty, null, null);
}
你可以简单地通过周围的代码块一个lock(_myLock)
声明锁定调用。
要获得绑定到一个事件的所有侦听器的列表,使用GetInvocationList
由于代表是不可改变的,所有你所要做的就是抢委托自身的引用。如果某人向共享事件添加了一个侦听器,则会创建一个新侦听器 - 并且您正在迭代的那个将保持不变。不需要锁。
EventHandler handler = OnEvent;
if (handler != null)
{
Parallel.ForEach(handler.GetInvocationList(),
del => del.DynamicInvoke(this, EventArgs.Empty));
}