HttpMessageHandler 应该使用 ConfigureAwait(false)

Should HttpMessageHandler use ConfigureAwait(false)

如果我在 HttpMessageHandler 中有一个异步调用,它是否应该使用 .ConfigureAwait 方法,例如

/// <summary>
/// Handler to assign the MD5 hash value if content is present
/// </summary>
public class RequestContentMd5Handler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (request.Content == null)
        {
            return await base.SendAsync(request, cancellationToken);
        }

        await request.Content.AssignMd5Hash().ConfigureAwait(false);

        var response = await base.SendAsync(request, cancellationToken);

        return response;
    }
}

我假设您是在谈论这一行,如果可以在该行上添加 ConfigureAwait(false)

await request.Content.AssignMd5Hash().ConfigureAwait(false);

不,在下一行您使用 Http 请求调用 SendAsync。您无法切换线程并且仍然可以访问正确的 http 请求上下文,因此您必须一起使用 ConfigureAwait(true) 或省略对 ConfigureAwait 的调用。

当等待代码之后的代码不需要返回到同步上下文提供的上下文时,您应该始终使用 ConfigureAwait(false)

/// <summary>
/// Handler to assign the MD5 hash value if content is present
/// </summary>
public class RequestContentMd5Handler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        if (request.Content != null)
        {
            await request.Content.AssignMd5Hash().ConfigureAwait(false);
        }

        return await base.SendAsync(request, cancellationToken);
    }
}