c# - 在直接从调用另一个库返回任务的库中使用 ConfigureAwait(false) 是否有利?

标签 c# .net async-await task-parallel-library dotnet-httpclient

跟进 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/

相关文章:

javascript - 异步并等待 Angular api响应

c# - 在 iframe 中使用 RedirectToAction 后,ASP.NET MVC session 会重置

c# - 不要在堆栈跟踪中显示构建机器的文件路径

c# - 为什么 c# 上的 paypal 开发人员说明在 github 上不同?

asp.net - ASP.Net 控件如何从它们的数据源中读取数据?

.net - Silverlight 本地存储

c# - 在gridview中动态添加控件

c# - PerHttpRequestLifeTimeManager for Unity with Web API 和 OWIN

c# - 纤程与异步等待

multithreading - TPL 和 async/await 之间的区别(线程处理)