取消对'HttpClient.SendAsync()'的调用

时间:2015-04-12 06:39:12

标签: c# .net dotnet-httpclient cancellation

是否可以取消对HttpClient.SendAsync()的调用?

我发送了一些这样的数据:

var requestMessage = new HttpRequestMessage(HttpMethod.Post, "some url");
var multipartFormDataContent = new MultipartFormDataContent();
// ... construction of the MultipartFormDataContent. It contains form data + picture file
requestMessage.Content = multipartFormDataContent;
var response = await client.SendAsync(requestMessage).ConfigureAwait(false);

此代码完美无缺,但我需要能够根据用户需求取消请求。这可能吗?

我发现有一个overload of SendAsync接受CancellationToken,但我不知道如何使用它。我还知道一个名为IsCancellationRequested的属性,它指示请求是否已被取消。但是如何实际取消请求?

1 个答案:

答案 0 :(得分:9)

SendAsync方法支持取消。您可以使用带CancellationToken的重载,可以随时取消。

为此,您需要使用CancellationTokenSource类。以下代码显示了如何执行此操作。

CancellationTokenSouce tokenSource = new CancellationTokenSouce();
...
var response = await client.SendAsync(requestMessage, tokenSource.Token)
    .ConfigureAwait(false);

如果您想取消请求,请致电tokenSource.Cancel();,然后您就完成了。

重要:无法保证取消CancellationTokenSource会取消基础操作。它取决于底层操作的实现(在本例中为SendAsync方法)。该操作可以在几秒钟后立即取消,或者永远不会取消。

值得注意的是,这是您取消支持CancellationToken的任何方法的方法。它适用于任何实现,而不仅仅是您问题主题的SendAsync方法。

有关详细信息,请参阅Cancellation in Managed Threads

相关问题