【问题标题】:Is there a way to force async/await to continue on the first available thread?有没有办法强制 async/await 在第一个可用线程上继续?
【发布时间】:2013-08-15 10:35:02
【问题描述】:

关于 C# 5.0 的一个很酷的地方是 async/await 关键字以及它如何简化您过去必须使用任务并行库 (TPL) 编写的管道。

我的问题是,如果您有与线程无关的代码,并且您碰巧在主线程(阅读:UI 线程)上触发了异步操作,但您不一定关心继续是否发生在主线程上,那么您可以告诉async/await 范式您希望它在第一个可用线程上继续,即使它不是主线程?

我认为能够做到这一点会大大提高某些场景的效率,但不是灵丹妙药。

【问题讨论】:

  • 请注意,在某些情况下,拥有此能力对于正常运行非常重要,而不仅仅是效率。您可以通过确保某些延续不在捕获的上下文中运行来避免导致死锁。

标签: c# multithreading async-await c#-5.0


【解决方案1】:

如果您不关心该方法的其余部分在哪里继续,请使用Task.ConfigureAwait

await foo.DoSomethingAsync().ConfigureAwait(continueOnCapturedContext: false);

(您没有必须在此处使用命名参数,但它可以提高清晰度。)

有关详细信息,请参阅Stephen Cleary's "best practices" article 的“配置上下文”部分。

【讨论】:

  • 哎呀,但以一种好的方式。 :) 我的意思是:我写了那篇文章,但你认为它是 Toub 质量的。
  • @StephenCleary:哎呀,对不起。我一直在搜索“Stephen Toub 最佳实践 ConfigureAwait”并发现 - 然后没有检查作者身份。深表歉意! (我确定我看过 Toub 的另一篇文章真的...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 2019-05-24
  • 2017-08-03
  • 2020-07-14
  • 2014-01-19
相关资源
最近更新 更多