簡體   English   中英

如何等待異步調用完成?

[英]How to wait async call completed?

假設我有兩個事件A和B。它們各自引發一個異步調用,例如AsyncA和AsyncB。

我想要的是:僅當AsyncB完成時,A才會調用AsyncA。

事件A和B依次觸發:A,然后B。我希望AsyncA在AsyncB完成之前完成,但是實際上,大多數情況下,AsyncB在AsyncA之前完成。

我無法將AsyncB呼叫置於AsyncA完成事件中。 如何確保AsyncB始終在AsyncA之后?

如果順序比異步方法重要,則不合適。

由於兩個調用都是異步運行的,因此無法控制它們的順序。 這是由調度程序完成的。

但是您可以使用TPL使它們兩者同步運行:

System.Threading.Tasks.Task.Factory.StartNew( ( ) => OnAsyncA() )
    .ContinueWith( ( t ) => OnAsyncB() );

您不能保證異步調用的完成順序,但是可以按想要的順序執行要完成的工作 您需要的是一種同步方式。

OnAsyncA您需要:

  1. 做您需要完成的工作,並在必要時保存OnAsyncB所需的信息。
  2. 設置一個等待句柄(例如ManualResetEventAutoResetEvent )。

OnAsyncB

  1. 保存所需的任何信息(例如結果)。
  2. 生成線程池線程 (因為WCF回調發生在UI線程上,所以在處理程序中等待信號是一個壞主意)。

在線程池線程中,

  1. 等待手柄。
  2. 做您通常會為OnAsyncB完成的OnAsyncB

這方面還有其他變體,例如,使用TPL等使較長的運行線程從“相關事件”隊列中出隊。

請記住要從線程池線程同步回UI線程。

暫無
暫無

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

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