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..Net 4.0
. El manejo de excepciones se cambió de forma predeterminada.net 4.5
para no derribar la aplicación . Vea más en Manejo de excepciones de tareas en .NET 4.5Por supuesto; significa que
Task
se 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.IsFaulted
y.Exception
en elTask
en el parámetro)TaskScheduler.UnobservedTaskException
evento y marcarlo como observado (llamare.SetObserved()
después de registrar el error)fuente
IsFaulted
, puede usar laOnlyOnFaulted
opción de continuación y evitar la verificación manual ...SetObserved
elUnobservedTaskExceptionEventArgs
tiene que ser llamado.Prueba este:
fuente