跟进 this question .我有一个包含许多异步方法的库,这些方法很薄地包装 HttpClient
.实际上,他们只是做了一些设置并直接返回从 HttpClient
调用返回的 Task
:
public Task DoThingAsyc() {
// do some setup
return httpClient.DoThingAsync();
}
我在考虑是否要将 ConfigureAwait(false)
添加到这些调用中。流行的智慧似乎是“是的,总是在图书馆这样做”。但在这种情况下,它会引入一些(可能可以忽略不计的)开销,因为 ConfigureAwait
返回一个 ConfiguredTaskAwaitable
需要将其包装回 Task
为了不改变方法签名。当然不难编码:
public async Task DoThingAsyc() {
// do some setup
return await httpClient.DoThingAsync().ConfigureAwait(false);
}
我的问题是,ConfigureAwait(false)
的效率优势是否可能超过在这种情况下引入的额外开销?以上哪个示例被认为是更好的做法?
最佳答案
不,不要这样做。
因为你没有使用await
,你不应该提前配置它。您的库的调用者有责任执行 ConfigureAwait
调用。调用者可能很想调用 ConfigureAwait(true)
而不是 ConfigureAwait(false)
- 你不知道。
仅当您在库中等待时,在库代码中调用 ConfigureAwait(false)
才是最佳实践。
在大多数情况下,代码如下:
async Task<Something> DoSomethingAsync()
{
return await DoSomethingElseAsync().ConfigureAwait(false);
}
相当于:
Task<Something> DoSomethingAsync()
{
return DoSomethingElseAsync();
}
if DoSomethingElseAsync
遵守 Task
协定(例如,如果它返回失败的 Task
而不是抛出异常)。
为此创建一个额外的状态机只是添加一层没有附加值的包装代码 - 最好直接返回 Task
。
换句话说:这样做没有任何效率优势,恰恰相反。
关于c# - 在直接从调用另一个库返回任务的库中使用 ConfigureAwait(false) 是否有利?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32551534/