返回任务或等待和ConfigureAwait(false)

时间:2014-05-08 08:42:15

标签: c# async-await

假设有一个像这样的方法的服务库

public async Task<Person> GetPersonAsync(Guid id) {
  return await GetFromDbAsync<Person>(id);
}

遵循 SynchronizationContext 的最佳做法最好使用

public async Task<Person> GetPersonAsync(Guid id) {
  return await GetFromDbAsync<Person>(id).ConfigureAwait(false);
}

但是当你只有一个操作(我认为)时,最好直接返回Task。见At the end of an async method, should I return or await?

public Task<Person> GetPersonAsync(Guid id) {
  return GetFromDbAsync<Person>(id);
}

在最后一种情况下,您无法使用 ConfigureAwait(false),因为不等待该方法。

什么是最佳解决方案(及其原因)?

1 个答案:

答案 0 :(得分:10)

每个选项都有自己的细节,请检查thisthis。如果你了解它们,你可以决定什么是最适合你的。

  

因此直接返回Task的解决方案并不能捕获   的SynchronizationContext?

它不是捕获当前同步上下文的任务。它是TaskAwaiter.OnCompleted(或ConfiguredTaskAwaitable.OnCompleted,如果是ConfigureAwait),它由C#编译器生成的代码间接调用,作为await语句的一部分为了这项任务。

所以,如果你不使用await,你不应该担心SynchronizationContext捕获,它本身并不会神奇地发生。这可能使第3个选项成为最有利的选项,但要记住它的exception propagation behavior