如何区分 HttpClient.CancelPendingRequests 和 CancellationTokenSource

How to tell the difference of HttpClient.CancelPendingRequests and CancellationTokenSource

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

  1. 请求超时,使用

    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(8000);

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

  2. 用户取消 HttpClient.CancelPendingRequests()

两种方法都导致了TaskCanceledException,但如何区分它们。

两个来源生产的 TaskCancelledException 之间没有区别。但是,由于您在范围内分配了 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
    }
}