HttpMessageHandler 应该使用 ConfigureAwait(false) 吗?



如果我在 HttpMessageHandler 中有一个异步调用,它应该使用 .配置等待方法,例如

/// <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)

/// <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);
}
}

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

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

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

最新更新