返回任务或等待和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传播行为 。