【问题标题】:Task<TResult>.ConfigureAwait(false) resumes on captured contextTask<TResult>.ConfigureAwait(false) 在捕获的上下文中恢复
【发布时间】:2017-05-09 03:20:24
【问题描述】:

我有以下代码块:

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

await task5Seconds;
await task2Seconds.ConfigureAwait(false);
  1. 第一个任务 await 被认为在相同(捕获的)上下文中恢复,但需要 5 秒。
  2. 第二个任务 await 配置为不在捕获的上下文中恢复,它只需要 2 秒。
  3. 结果是在第二个任务等待之后,它仍然在捕获的上下文中恢复。

我不明白底层逻辑,谁能给我解释一下?

谢谢 科伊

【问题讨论】:

    标签: c# async-await task-parallel-library


    【解决方案1】:

    当您调用ConfigureAwait(false) 时,您是在告诉.NET 在await 之后恢复执行时,框架不需要 在相同的上下文中恢复执行。但这与告诉框架它需要在相同的上下文中恢复是不同的。

    您的第二个await 正在等待已完成的任务。因此,可以立即同步执行继续,即无需放弃对线程的控制。因此,在这种情况下,您的代码将保持在相同的上下文中。

    await 并不是专门将您返回到原始上下文。相反,只是它没有理由离开那个上下文,所以当await 完成时你仍然在那里。

    【讨论】:

    • @EmrahSüngü 它在哪里?
    • @Khoi:他删除了他的答案,因为两者都不正确。他对您的代码中发生的事情有误。
    • 感谢@PeterDuniho。我也在读他的cmets,但它不正确,但我认为他对你有很好的学习。我也是:)
    • @Khoi,就像彼得指出的那样,我错了,但这对我来说是一个很好的学习。但他是一位严格的老师 :) 我没有注意到你一创建任务就开始了。 Task task2Seconds = Wait2Seconds(); Task task5Seconds = Wait5Seconds();
    猜你喜欢
    • 2015-11-23
    • 2014-06-25
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    相关资源
    最近更新 更多