【问题标题】:Cancel call to 'HttpClient.SendAsync()'取消对“HttpClient.SendAsync()”的调用
【发布时间】:2015-04-12 06:39:12
【问题描述】:

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

【问题讨论】:

    标签: c# .net dotnet-httpclient cancellation


    【解决方案1】:

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

    为此,您需要使用CancellationTokenSource 类。下面的代码展示了如何做到这一点。

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

    如果您想取消请求,请致电tokenSource.Cancel(); 即可完成。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多