[英]How to call all event handlers concurrently bind to an event
幾天前,我遇到了一個問題:如何調用所有事件處理程序並行綁定到一個事件。
我的問題是:
如何獲取綁定到事件的所有事件處理程序的列表?
雖然我將調用所有事件處理程序,但沒有人應該能夠為該事件添加新的事件處理程序。 所以,基本上我需要在調用事件處理程序時獲取鎖定。 那么,如何在c#中解決這個問題呢?
要獲取綁定到事件的所有偵聽器的列表,請使用GetInvocationList
由於委托是不可變的,您所要做的就是獲取對委托本身的引用。 如果有人向共享事件添加了一個偵聽器,則會創建一個新的偵聽器 - 並且您正在迭代的那個將保持不變。 不需要鎖。
EventHandler handler = OnEvent;
if (handler != null)
{
Parallel.ForEach(handler.GetInvocationList(),
del => del.DynamicInvoke(this, EventArgs.Empty));
}
你的意思是獲得調用列表?
var handler = MyHandler;
if (handler != null)
{
var invocationList = handler.GetInvocationList();
foreach (EventHandler receiver in invocationList)
receiver.BeginInvoke(this, EventArgs.Empty, null, null);
}
您可以通過在該代碼塊周圍使用lock(_myLock)
語句來簡單地鎖定調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.