2014-12-04 3 views
5

ConfigureAwait(false)是否保證繼續運行在不同的線程上,或只表示它不是強制運行在同一線程上?如何保證異步方法繼續在另一個線程上運行?

有沒有什麼方法可以提供保證?

我需要跨線程測試上下文流。

+3

該任務也可以在同一個線程上同步完成,在這種情況下'ConfigureAwait(false)'什麼都不做。國際海事組織,獲得保證的最簡單方法是使用自定義服務器(而不是'ConfiguredTaskAwaitable')。 – Noseratio 2014-12-04 10:04:36

+1

@Noseratio謝謝你的評論。我完全忘記了這種可能性。 – 2014-12-04 11:36:33

+0

沒問題;總的來說,我不會指望'ConfigureAwait(false)'不僅僅是一種優化,以避免重複的上下文切換。請注意[MSDN文檔說](http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.configureawait%28v=vs.110%29.aspx):* true試圖將續集編組回到原始上下文;否則爲false。*超出該語句的任何其他行爲都將被記錄爲非文檔,並且可能是版本特定的。 – Noseratio 2014-12-04 12:06:03

回答

8

使用ConfigureAwait(false)告訴服務員不要在捕獲的上下文中恢復,因此SynchronizationContext被忽略。這意味着繼續將安排使用ThreadPool線程的默認TaskScheduler

如果原始線程爲ThreadPool線程,則繼續可能在同一線程上運行,否則您保證它是不同的線程。

您可以使用沒有SynchronizationContext(或ConfigureAwait(false))的專用線程開始測試,以確保線程在async操作前後不同。

0

下面的情景ConfigureAwait(false)沒有運行新的上下文。

Task task2Seconds = Wait2Seconds(); 
Task task5Seconds = Wait5Seconds(); 

await task5Seconds; 
await task2Seconds.ConfigureAwait(false); 

第一await不具有ConfigureAwait(false)但它需要更長的時間比第二await誰擁有配置,但隨時準備恢復提前。所以第二個會在同一個環境中恢復。

相關問題