Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

163
Visualizações
Manera correcta de correlacionar una OperationCanceledException con un CancellationToken

Estoy usando una API asíncrona que admite la cancelación y le estoy pasando a esa API una instancia de CancellationToken . Como de costumbre, si se solicita la cancelación en el token pasado, la API que invoco arrojará una OperationCanceledException (este es el patrón de cancelación cooperativo estándar del marco .NET).

Quiero poder capturar OperationCanceledException si y solo si es la excepción generada debido a la cancelación del token de cancelación proporcionado.

El siguiente código ilustra lo que estoy tratando de lograr:

 try { await _service.DoSomethingAsync(cancellationToken: token); } catch (OperationCanceledException ex) when ( /* here I want a condition signifying that the OperationCanceledException is caused by the cancellation of the token object */) { // avoid logging the exception: this is raised by design (cooperative cancellation) throw; } catch (Exception ex) { _logger.LogError(ex, "An error occurred: {0}", ex.Message); throw; }

Para el filtro de excepción del código anterior, básicamente tengo dos ideas:

  • comprobando la propiedad IsCancellationRequested en el objeto token : when (token.IsCancellationRequested)
  • comprobando la propiedad CancellationToken en el objeto ex : when (ex.CancellationToken == token)

¿Cuál es la forma correcta de hacer la verificación que quiero realizar? ¿Son equivalentes las dos formas mostradas arriba? ¿Existe una mejor práctica?

NOTA IMPORTANTE : sé que el código que se muestra arriba se puede escribir de una manera más eficiente, porque la captura de excepciones es una operación costosa. Probablemente, lo mejor que puede hacer es eliminar el primer bloque catch y solo capturar una Exception si y solo si no está relacionada con la cancelación del objeto token . Soy consciente de eso, pero ese no es el punto de mi pregunta. He escrito el código en la pregunta de esa manera solo para mayor claridad , porque el objetivo de mi pregunta es cómo correlacionar correctamente una OperationCanceledException con CancellationToken que ha causado la excepción en sí.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Quiero poder capturar OperationCanceledException si y solo si es la excepción generada debido a la cancelación del token de cancelación proporcionado.

No puede hacer esto exactamente , pero puede "atrapar la excepción cancelada solo si mi token proporcionado ha sido cancelado", lo que generalmente es lo suficientemente bueno.

when (token.IsCancellationRequested) es lo que desea.

No marque ex.CancellationToken , porque el método al que está llamando puede estar observando un token de cancelación vinculado, que sería diferente al que proporcionó.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda