2011-11-24 262 views
2

假設我有兩個事件A和B.他們每個人都引發異步調用,比如AsyncA和AsyncB。如何等待異步調用完成?

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

事件A和B按順序依次觸發:A,然後B. 我預計AsyncA在AsyncB完成之前完成,但實際上大部分時間,AsyncB在AsyncA之前完成。

我不能在AsyncA完成的事件中放置AsyncB調用。 如何確保AsyncB始終在AsyncA之後?

+1

你能解釋爲什麼你不能在AsyncA完成的處理程序中調用AsyncB嗎? –

+0

+1這個經典問題。我想你必須讓某個房間「以某種方式」在AsyncA完成的事件上調用AsyncB。 –

+0

因爲事件A和B被不同的地方從不同的理由解僱了。 – KentZhou

回答

0

如果順序比異步方法調用不重要,

+0

您不能對SL –

+0

進行同步呼叫,以防他的方法邊界出錯 – Jason

+0

無法從SL調用WCF服務?我不這麼認爲。 – KentZhou

0

只要兩個調用異步運行,它就無法控制它們的順序。這由調度程序完成。

但是你可以使用TPL有他們兩個同步運行:

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

這是一個蠻力的方法,我認爲問題可以而且應該圍繞着設計。也就是說,設計它以便B不依靠A完成。這可能意味着將所有代碼凝結成方法A – Jason

+0

我不知道爲什麼這種方法是蠻力的。但我同意更好的設計可以避免這些問題。 – PVitt

+0

蠻力因爲你使用代碼來解決設計問題 – Jason

0

不能保證臺異步調用的完成順序,但你可以執行工作要在爲了做你要。你需要的是一種同步的方式。

OnAsyncA您需要:

  1. 你需要做,如果有必要節省OnAsyncB所需的信息的工作。
  2. 設置等待手柄(例如ManualResetEventAutoResetEvent)。

OnAsyncB

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

在線程池線程,

  1. 等待句柄。
  2. 完成您通常爲OnAsyncB所做的工作。

還有其他的變化,比如有一個更長的運行線程從「依賴事件」隊列中出隊,使用TPL等等。

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