取消对 'HttpClient.SendAsync()' 的通话

Cancel call to 'HttpClient.SendAsync()'

是否可以取消对 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 的 属性,它指示请求是否已被取消。但是我该如何真正取消请求?

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

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

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

当您想取消请求时,调用tokenSource.Cancel();即可。

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

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

更多信息,请参考Cancellation in Managed Threads