Qualquer maneira de diferenciar Cancelar e Tempo limite
Eu tenho algum código que está validando alguns dados fazendo chamadas para vários outros serviços. Inicio todas as chamadas em paralelo e espero até que pelo menos uma delas termine. Se alguma das solicitações falhar, não me importo com o resultado das outras chamadas.
Eu faço as ligações comHttpClient
e eu passei umHttpMessageHandler
nisso faz um monte de registro. Essencialmente:
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;
}
Não, a parte com a qual estou tendo problemas é quando cancelo as solicitações. Quando cancelo uma solicitação, faço-a de propósito; portanto, não quero que ela seja registrada como um tempo limite, mas não parece haver nenhuma diferença entre um cancelamento e um tempo limite real.
Existe alguma maneira de conseguir isso?
Editar: Eu preciso esclarecer isso um pouco. O serviço que faz as chamadas em paralelo está passando em CancellationTokens com um tempo limite:
var ct = new CancellationTokenSource(TimeSpan.FromSeconds(2));
Portanto, quando o servidor leva mais de dois segundos para responder, recebo umaOperationCanceledException
e se eu cancelar manualmente a fonte do token (digamos, porque outro servidor retornou um erro após 1 segundo), ainda recebo umOperationCanceledException
. Idealmente, eu seria capaz de olharCancellationToken.IsCancellationRequested
para determinar se foi cancelado devido a um tempo limite, em vez de explicitamente solicitar o cancelamento, mas parece que você obtém o mesmo valor, independentemente dequão foi cancelado.