首页 > 解决方案 > 如何区分 HttpClient.CancelPendingRequests 和 CancellationTokenSource

问题描述

我正在使用System.Net.Http.HttpClient,现在我有两个取消请求选项。

  1. 请求超时,使用

    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(8000);

    HttpResponseMessage response = await client.GetAsync(strRequestUrl, cancellationTokenSource.Token);

  2. 用户取消HttpClient.CancelPendingRequests()

两种方法都引起了TaskCanceledException,但是如何区分它们。

标签: c#httpclient

解决方案


TaskCancelledException两种来源产生的a 之间没有区别。但是,由于您有一个已CancellationTokenSource分配的范围,您可以轻松地询问它是否已设置:

using (var tokenSource = new CancellationTokenSource(8000))
{
    try
    {
        var resp = await httpClient.GetAsync("https://www.example.com",
            tokenSource.Token);
        // ...
    }
    catch (TaskCanceledException)
    {
        var cancelledBecauseOfTimeout = tokenSource.IsCancellationRequested;
        // handle accordingly
    }
}

推荐阅读