2011-01-19 165 views
7

我想從我的圖書館類中引發一系列事件,但我擔心一些事件訂閱者會粗魯,需要很長時間來處理一些事件,從而阻塞引發事件的線程。我以爲我可以通過使用一個線程池中的線程來提高每個事件保護提高線:如果只有一個用戶到事件我可以在MulticastDelegate中使用BeginInvoke嗎?

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

這工作正常,但只要第二用戶到達時,DataPacketReceived成爲多播委託,我得到一個參數異常與錯誤消息,「委託必須只有一個目標。」有沒有簡單的方法來在單獨的線程上提高事件,還是必須啓動一個線程,然後從那裏提出事件?

回答

11

我在another site上發現了一個類似的問題,當然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); 
    } 
} 
+2

正確的,但要注意,調用`BeginInvoke`每個單獨的用戶並不一定意味着每次都會在一個單獨的線程上運行。這是線程池的業務。 – Ani 2011-12-23 05:46:54

相關問題