簡體   English   中英

如何調用所有事件處理程序並發綁定到事件

[英]How to call all event handlers concurrently bind to an event

幾天前,我遇到了一個問題:如何調用所有事件處理程序並行綁定到一個事件。

我的問題是:

  1. 如何獲取綁定到事件的所有事件處理程序的列表?

  2. 雖然我將調用所有事件處理程序,但沒有人應該能夠為該事件添加新的事件處理程序。 所以,基本上我需要在調用事件處理程序時獲取鎖定。 那么,如何在c#中解決這個問題呢?

  1. 要獲取綁定到事件的所有偵聽器的列表,請使用GetInvocationList

  2. 由於委托是不可變的,您所要做的就是獲取對委托本身的引用。 如果有人向共享事件添加了一個偵聽器,則會創建一個新的偵聽器 - 並且您正在迭代的那個將保持不變。 不需要鎖。


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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM