2017-05-09 63 views
3

我有下面的代碼塊:任務<TResult> .ConfigureAwait(假)恢復上捕捉的上下文

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

await task5Seconds; 
await task2Seconds.ConfigureAwait(false); 
  1. 第一項任務等待被認爲是恢復在相同(捕獲的)上下文中,但它需要5秒。
  2. 等待的第二個任務被配置爲在捕獲的上下文中不恢復,並且只需要2秒。
  3. 結果是在第二個任務等待之後,它仍然在捕獲的上下文中繼續。

我不明白底層的邏輯,任何人都可以向我解釋?

感謝 科伊

回答

5

當你調用ConfigureAwait(false),你告訴.NET的await後恢復執行時,該框架是不是需要恢復在同樣的情況下執行。但這不同於告訴框架,它在需要而不是恢復在相同的上下文。

您的第二個await正在等待已完成的任務。這樣,繼續可以立即並且同步執行,即不放棄對線程的控制。所以,在這種情況下,你的代碼保持在相同的上下文中。

這不是await明確地返回到原始上下文。相反,它只是沒有理由離開這個環境,所以當await完成時你仍然在那裏。

+0

聽起來不錯! – Khoi

+0

@EmrahSüngü它在哪裏? – Khoi

+0

@Khoi:他刪除了他的答案,因爲這兩個都不正確。他誤解了你的代碼中發生了什麼。 –