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);
}
}
如果我在 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);
}
}