6

tengo una tarea con una continuación para controlar los errores:Continuación de tareas (OnlyOnFaulted) todavía recibe una excepción no observada

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 
var loadTask = Task<List<OrderItemViewModel>>.Factory.StartNew(() => 
{ 
     throw new Exception("derp"); 
}); 

var errorContinue = loadTask.ContinueWith(t => 
    { 
     MainViewModel.RemoveViewModel(this); 
    }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, uiScheduler); 

La continuación es golpeado, pero unos segundos después de recibir este error en la aplicación:

La (s) excepción (es) de la Tarea no se observaron al Esperar en la Tarea o al acceder a su propiedad de Excepción. Como resultado, la excepción no observada se volvió a lanzar por el hilo del finalizador.

¿Está relacionado con el uiScheduler? La solución a la pregunta similar es básicamente lo que estoy haciendo A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was

Respuesta

6

Es necesario para manejar realidad (o, al menos, observar) la excepción:

var errorContinue = loadTask.ContinueWith(t => 
{ 
    // Observe/acknowledge the exception. 
    // You can use t.Wait(), which throws, or just grab the exception 
    var exception = t.Exception; 
    MainViewModel.RemoveViewModel(this); 
}, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, uiScheduler); 

Esto es debido a esta línea de la documentation on exception handling in the TPL:

Si no espera en una tarea que propaga una excepción o accede a su propiedad Excepción, la excepción se escala de acuerdo con la política de excepciones .NET cuando la tarea se recolecta de forma incorrecta.

En su caso, tiene una continuación, pero en realidad nunca "espera la excepción" ni accede a la propiedad de la excepción. El motivo por el que mi respuesta (en la pregunta relacionada que publicó) es que realmente soy usando la propiedad Excepción en la Tarea pasada a través de la continuación.

+0

Microsoft ha cambiado la política de excepción .NET desde que se escribió esta respuesta. Consulte excepciones no observadas en https://msdn.microsoft.com/en-us/library/hh367887.aspx#core –

Cuestiones relacionadas