2015-06-08 109 views
5

我需要異步調用相同功能的代理人數。 問題是我應該如何處理回撥函數? 我們有幾個代表正在運行,所以CallbackMethod並不意味着所有的異步代理都完成了。異步調用代理週期

AsyncMethodCaller c = new AsyncMethodCaller(instance.dummyMethod); 
for (int i = 0; i < 100; i++) 
    { 
     IAsyncResult res = c.BeginInvoke(5000, 
      out dummy, 
      new AsyncCallback(CallbackMethod), 
      "executed on thread {0}, with result value \"{1}\"."); 
} 
+0

每次調用instance.dummyMethod時都會調用CallbackMethod。如果您需要等待主線程中的所有調用完成,則可以將所有IAsyncResult添加到列表中,然後通過調用IAsyncResult.IsComplete或使用WaitHandle.WaitAll方法來輪詢循環中的每個項目 –

回答

0

我會考慮考慮使用帶有TPLTask秒。

var task1 = Task.Run(() => instance.dummyMethod) 
    .ContinueWith((completedTask) => Console.WriteLine("Each callback here. Result: " + completedTask.Result)); 

// Blocks calling thread until all tasks are done. 
Task.WaitAll(new [] { task1, task2 }); 

WaitAll都確保所有Task s的繼續在主線程之前完成。以上允許您實現個別回調。

或者使用一個回調所有異步方式完成:

Task.Factory.ContinueWhenAll(new [] { task1, task2 }, 
    (allTasks) => Console.WriteLine("Callback when all are done.")); 
0

我會傾向於使用微軟的反應框架(的NuGet「RX-主」)這個,因爲它會要簡單得多。

下面的代碼:

var query = 
    from n in Observable.Range(0, 100) 
    from dummy in Observable.Start(() => instance.dummyMethod()) 
    select dummy; 

query 
    .Subscribe(
     dummy => 
     { 
      Console.WriteLine(dummy.ToString()); 
     }, 
     () => 
     { 
      Console.WriteLine("Done."); 
     }); 

.Subscribe方法對生產以及何時已返回所有值「完成」回調每個dummy值的回調。

該查詢會自動爲您在多個線程上運行。