2017-05-09 69 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:他删除了他的答案,因为这两个都不正确。他误解了你的代码中发生了什么。 –