是否可以取消对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
的属性,它指示请求是否已被取消。但是如何实际取消请求?
答案 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