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

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

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

遵循SynchronizationContext的最佳实践最好使用

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

但是当你只有一个操作(我认为)最好直接返回任务。 请参阅异步方法的结尾,我应该返回还是等待?

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

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

什么是最佳解决方案(以及为什么)?

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

那么直接返回Task的解决方案不会捕获SynchronizationContext?

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

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