取消对 '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
是否可以取消对 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