Любой способ различить Отмена и Тайм-аут

У меня есть некоторый код, который проверяет некоторые данные, совершая звонки в ряд других служб. Я запускаю все вызовы параллельно, а затем жду, пока не завершится хотя бы один из них. Если какой-либо из запросов не выполняется, меня не волнует результат других звонков.

Я звоню сHttpClient и я прошелHttpMessageHandler в том, что делает кучу регистрации. По существу:

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    HttpResponseMessage response = null;

    try
    {
        response = await base.SendAsync(request, cancellationToken);
    }
    catch (OperationCanceledException ex)
    {
        LogTimeout(...);
        throw;
    }
    catch (Exception ex)
    {
        LogFailure(...);
        throw;
    }
    finally
    {
        LogComplete(...);
    }

    return response;
}

Нет, часть, с которой у меня проблемы, это когда я отменяю запросы. Когда я отменяю запрос, я делаю это специально, поэтому я не хочу, чтобы он регистрировался как тайм-аут, но между отменой и реальным тайм-аутом нет никакой разницы.

Есть ли способ сделать это?

Редактировать: Мне нужно уточнить это, немного. Служба, выполняющая параллельные звонки, передается в CancellationTokens с таймаутом:

var ct = new CancellationTokenSource(TimeSpan.FromSeconds(2));

Поэтому, когда серверу требуется более двух секунд для ответа, я получаюOperationCanceledException, и если я вручную отменяю источник токена (скажем, потому что другой сервер возвратил ошибку через 1 секунду), то я все равно получаюOperationCanceledException, В идеале я бы мог посмотреть наCancellationToken.IsCancellationRequested определить, было ли оно отменено из-за тайм-аута, в отличие от явного запроса на отмену, но, похоже, вы получаете одно и то же значение независимо от того,как это было отменено.

Ответы на вопрос(2)

Ваш ответ на вопрос