2012-07-17 48 views
1

這段代碼如何通過處理時間來表現? (即,如何同步呢?)如何同步/阻塞是事件/委託訂閱?

public delegate void FooDelegate(bytes[] data); 
public event FooDelegate FooEvent; 

FooEvent += new FooDelegate(Process_X); 
FooEvent += new FooDelegate(Process_Y); 
FooEvent += new FooDelegate(Process_Z); 

while (receiving) 
{  
    byte[] data = getRealTimeData(); 

    StopWatch.Start(); 

    FooEvent(data); 

    StopWatch.Stop(); 

    Console.Write(StopWatch.Elapsed.Millisec)); 
    StopWatch.Reset(); 
} 

我有幾個問題:

  1. 將在調用每個訂閱流程順序/ synchornously調用FooEvent結果呢? (可能是......)
  2. 假設每個Process_N需要很長時間才能完成,那麼每個呼叫是否會阻塞鏈(即呼叫下一個鏈)直至完成?如果這是真的,如何讓事件調用以並行方式處理X,Y,Z然後等待所有這些完成,而不是逐個調用它們,然後依次等待每個完成?

幾個確認:

  1. 如果用戶數量變得非常高,我想用秒錶打印的時間會獲得更高的
  2. 如果Process_N處理邏輯變得更重,它也會影響StopWatch打印的時間
+1

尋找'平行事件',你會發現這些問題:http://stackoverflow.com/questions/7834130/events-with-task-parallel-library http://stackoverflow.com/questions/ 1516119/c-sharp-events-how-to-process-event-in-a-parallel-manner http://stackoverflow.com/questions/6453655/parallel-event-handling-in-c-sharp – 2012-07-17 10:44:27

+0

@gt:甜。你能把這個作爲答案嗎? – 2012-07-17 11:19:27

回答

1

它看起來像你會受益於你的事件處理程序的並行化,因爲它們確實會按順序同步執行。

創建自定義事件處理程序,你可能會這樣寫:

public event FooDelegate FooEvent 
{ 
    add 
    { 
     // code to add an event handler 
    } 
    remove 
    { 
     // code to remove an event handler 
    } 
} 

參見如何處理自定義事件處理程序做了詳細信息,下面的問題:對於.NET

和Jon Skeet的頁面上delegates and events

1

1:是 2:是 它必須事件可能會返回結果。

但是:您應該以某種方式實現您的事件處理程序,以便它們不需要很長時間就可以運行! 如果他們必須執行繁重的工作,請考慮在您的事件處理程序中啓動的任務中運行計算。

+0

此任務應該以並行方式調用訂戶嗎? – 2012-07-17 11:13:01

+0

沒有,如果事件處理程序沒有做太多的事情,你可以按照原樣進行調用 - 重點是讓處理程序只執行短暫的計算 – Carsten 2012-07-17 12:00:42