6

Estoy utilizando la Biblioteca de tareas paralelas para ejecutar una tarea que, cuando se cancela, arroja la OperationCanceledException, que luego se captura usando AggregateException, de la siguiente manera. The AggregateException contiene una lista de TaskCanceledExceptions, que corresponde a las excepciones arrojadas. Desafortunadamente, estas TaskCanceledExceptions parecen estar perdiendo los rastros de pila lanzados por las excepciones originales. ¿Esto es por diseño?TaskCanceledException en AggregateException no contiene seguimiento de pila

try 
{ 
    task1.Wait(); 
} 
catch (AggregateException aggEx) 
{ 
    var tcex = ex as TaskCanceledException; 
    if (tcex != null) 
    { 
     Debug.WriteLine("InnerException:{0}, Message:{1}, Source:{2}, StackTrace: {3}", 
      tcex.InnerException, tcex.Message, tcex.Source, tcex.StackTrace); 

     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Resultado:

InnerException:, Message:A task was canceled., Source:, StackTrace: 
+2

¡Actualice su código para reflejar los resultados que ha publicado! :) –

+0

¿Es correcta la línea "if (tcex! = Null)"? Parece que debería ser "if (tcex == null)" –

+0

@MatthewWatson - este 'if' filtra otras excepciones. –

Respuesta

1

yo creo que es por diseño, tarea cancelados excepciones normalmente sólo se inicia cuando se cancela una tarea que significa para ayudar a la tarea para salir. ¿Para qué sirve un seguimiento de pila en esta situación? Dicho esto, no tengo una idea del proceso de pensamiento de los desarrolladores que diseñaron las excepciones de cancelación, solo mi opinión.

No estoy muy seguro de lo que quiere decir con que pierden el rastro de pila arrojado por la excepción original? Normalmente no tendrían una excepción interna/original. Tal vez está cancelando una tarea debido a alguna otra excepción? En ese caso, debería capturar la excepción "original" en sentido ascendente, iniciar sesión allí y luego cancelarla.

+3

La razón por la que se necesitaría un seguimiento de pila es para fines de registro; Estoy llamando al ThrowIfCancellationRequested() a lo largo de varios puntos en mi código. Registrar el seguimiento de la pila me permitiría identificar en qué momento se confirma la solicitud de cancelación. – sfarrugia

Cuestiones relacionadas