Si crea una tarea y nunca llama task.Wait()ni intenta recuperar el resultado de una Task<T>, cuando la tarea es recopilada por el recolector de basura, derribará su aplicación durante la finalización. Para obtener más información, consulte la página de MSDN sobre Manejo de excepciones en el TPL .
La mejor opción aquí es "manejar" la excepción. Esto se puede hacer a través de una continuación: puede adjuntar una continuación a la tarea y registrar / tragar / etc. la excepción que ocurre. Esto proporciona una forma limpia de registrar las excepciones de tareas y se puede escribir como un método de extensión simple, es decir:
public static void LogExceptions(this Task task)
{
task.ContinueWith( t =>
{
var aggException = t.Exception.Flatten();
foreach(var exception in aggException.InnerExceptions)
LogException(exception);
},
TaskContinuationOptions.OnlyOnFaulted);
}
Con lo anterior, puede evitar que cualquier tarea elimine la aplicación y la registre a través de:
Task.Factory.StartNew( () =>
{
// Do your work...
}).LogExceptions();
Alternativamente, puede suscribirse a TaskScheduler.UnobservedTaskException y manejarlo allí.
Offen una clase nombrada como la palabra de cuatro letras de su elección, y úselo para sus continuaciones generales. Ayuda a combatir parte de la frustración acumulada por esta excepción en particular..Net 4.0. El manejo de excepciones se cambió de forma predeterminada.net 4.5para no derribar la aplicación . Vea más en Manejo de excepciones de tareas en .NET 4.5Por supuesto; significa que
Taskse finalizó después de dejarlo en la recolección de basura, pero la tarea en sí falló. Hay dos correcciones:ContinueWith(...)de suscripción, y comprobar.IsFaultedy.Exceptionen elTasken el parámetro)TaskScheduler.UnobservedTaskExceptionevento y marcarlo como observado (llamare.SetObserved()después de registrar el error)fuente
IsFaulted, puede usar laOnlyOnFaultedopción de continuación y evitar la verificación manual ...SetObservedelUnobservedTaskExceptionEventArgstiene que ser llamado.Prueba este:
fuente