2014-03-07 72 views
0

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

我的问题是:

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

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

回答

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)声明锁定调用。

2
  1. 要获得绑定到一个事件的所有侦听器的列表,使用GetInvocationList

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


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