簡體   English   中英

等待帶有回調的多種方法完成

[英]Wait for multiple methods with callbacks to finish

我有多個異步方法需要調用,並等待它們全部完成。 異步方法都具有在異步處理完成后執行的回調參數。 所以我在想,我需要在每個回調中放置一些信號設備,然后等待所有信號出現,然后再繼續。

經過一些搜索之后,我想我可以使用一個AutoResetEvents數組,然后調用WaitHandle.WaitAll等待它們。 就像是:

WaitHandle[] waitHandles = new WaitHandle[] 
{
    new AutoResetEvent(false),
    new AutoResetEvent(false)
};

DoWorkA((callback) =>
{
    waitHandles[0].Set();
});

DoWorkB((callback) =>
{
    waitHandles[1].Set();
});

// wait for DoWorkA and DoWorkB to finish
WaitHandles.WaitAll(waitHandles);

// continue with the processing

我想知道這是否是一個好方法,或者是否有更好/更簡單的方法。 我需要一個適用於.Net 2.0的解決方案,但我也想知道更高版本的.Net將提供哪些其他解決方案。

編輯:嘗試此代碼后,我發現它不起作用。 UI線程在WaitHandles.WaitAll(waitHandles)處停止,並且回調永遠不會運行...

在DoWork方法內部,有代碼在后台線程上異步運行,然后從該后台線程我嘗試通過UI線程在控件上調用的BeginInvoke運行回調。 但是,回調永遠不會在UI線程上執行。 有什么想法我做錯了嗎?

編輯2:我意識到了為什么它不起作用-調用WaitHandles.WaitAll(waitHandles)的線程與回調試圖在其上運行的線程相同(UI線程)。 因此,當然,如果線程正在等待信號,則回調將永遠不會在同一線程上運行,因此Set()將永遠不會被調用。 只要不打算在同一線程上運行,WaitAll(waitHandles)和Set()應該可以工作。 我認為我需要對其進行修復,以使回調在UI線程等待時在后台線程上運行。 如果我的想法不正確,請告訴我。

是的,使用事件是等待多個回調完成的合理方法,對於2.0,如果您不能使用外部庫,則可能是最好的選擇。

您可以使用一個事件重寫代碼並計算回調完成的次數,但可能會更復雜(同時允許無限數量的回調)。 或可以通過信號量實現類似的方法。

如果您可以使用4.5+,那么用async / await重寫方法可能是更好的選擇。

  // use "async Task(...)" as equivalent of "void DoWorkA(...)".
  async Task<int> DoWorkAAsync(int arg1)
  {
     var serviceResult = await service.CallAsync(arg1);
     return ParseServiceResult(serviceResult);
  }

  async Task<int> DoWorkBAsync() 
  { 
     ... await SomeAsync(1,2,3);...
     return someResult;
  }

  var tasks = new[] {DoWorkAAsync(42), DoWorkBAsync() }; 
  await Task.WhenAll(tasks);

  var resultOfA = tasks[0].Result;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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