【发布时间】:2026-02-12 00:10:01
【问题描述】:
假设有一个带有这样方法的服务库
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);
}
但是当你只有一个操作时(我认为)最好直接返回任务。见At the end of an async method, should I return or await?
public Task<Person> GetPersonAsync(Guid id) {
return GetFromDbAsync<Person>(id);
}
在最后一种情况下,您不能使用 ConfigureAwait(false),因为没有等待该方法。
什么是最好的解决方案(以及为什么)?
【问题讨论】:
-
我认为最后一个(委托)是最清楚的,不涉及创建额外的状态机。除非您在依赖于异步调用结果的方法中执行其他操作,否则我认为使用
await毫无意义。 -
最后一个对我来说最有意义。它返回一个任务,您可以从调用 GetPersonAsync 的任何位置等待它
-
那么直接返回Task的方案没有捕获到SynchronizationContext?
-
你正在做的是让你的调用者决定他们希望如何等待
Task完成 - 如果那个代码是async,它可以决定在awaiting结果时是否捕获上下文。 -
@Damien_The_Unbeliever 好的,因此在最新示例中没有切换上下文开销?
标签: c# async-await