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í.
Off
en 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.