HttpMessageHandler是否应使用ConfigureAwait(false)?

3

如果我在 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;
    }
}
2个回答

4

当等待代码后的代码不需要返回由同步上下文提供的上下文时,应始终使用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);
    }
}

1
我猜您在谈论这一行,并且是否可以在该行上使用ConfigureAwait(false)
await request.Content.AssignMd5Hash().ConfigureAwait(false);

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

谢谢,问题的基本原理是关于服务器端代码的所有其他主题都应该始终使用ConfigureAwait(false) - 我将使用ConfigureAwait(true),以便不会混淆。 - Paul Hatcher
4
怎么回事?正确的HTTP请求已作为参数传递。 - Paulo Morgado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接