假设有一个像这样的方法的服务库
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),因为不等待该方法。
什么是最佳解决方案(及其原因)?
答案 0 :(得分:10)
每个选项都有自己的细节,请检查this和this。如果你了解它们,你可以决定什么是最适合你的。
因此直接返回Task的解决方案并不能捕获 的SynchronizationContext?
它不是捕获当前同步上下文的任务。它是TaskAwaiter.OnCompleted
(或ConfiguredTaskAwaitable.OnCompleted
,如果是ConfigureAwait
),它由C#编译器生成的代码间接调用,作为await
语句的一部分为了这项任务。
所以,如果你不使用await
,你不应该担心SynchronizationContext
捕获,它本身并不会神奇地发生。这可能使第3个选项成为最有利的选项,但要记住它的exception propagation behavior。