Dot-Net

我可以將 BeginInvoke 與 MulticastDelegate 一起使用嗎?

  • December 23, 2011

我想從我的庫類中引發一系列事件,但我擔心某些事件訂閱者會很粗魯並且需要很長時間來處理某些事件,從而阻塞引發事件的執行緒。我想我可以通過使用執行緒池執行緒來引發每個事件來保護引發執行緒:

if (packet != null && DataPacketReceived != null)
{
   var args = new DataPacketEventArgs(packet);
   DataPacketReceived.BeginInvoke(this, args, null, null);
}

當事件只有一個訂閱者時,這可以正常工作,但是一旦第二個訂閱者到達,DataPacketReceived就會成為多播委託,並且我收到帶有錯誤消息的參數異常,“委託必須只有一個目標。” 有沒有一種簡單的方法可以在單獨的執行緒上引發事件,還是我必須啟動一個執行緒然後從那裡引發事件?

我在另一個網站上發現了一個類似的問題,當然 Jon Skeet 已經回答了。對於我的場景,我選擇在單獨的執行緒上為每個訂閱者引發事件:

if (packet != null && DataPacketReceived != null)
{
   var args = new DataPacketEventArgs(packet);
   var receivers = DataPacketReceived.GetInvocationList();
   foreach (EventHandler<DataPacketEventArgs> receiver in receivers)
   {
       receiver.BeginInvoke(this, args, null, null);
   }
}

引用自:https://stackoverflow.com/questions/4731061