6

Ho un compito con una continuazione per gestire gli errori:Task Continuazione (OnlyOnFaulted) diventa ancora un'eccezione inosservata

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 continuazione viene colpito, ma pochi secondi dopo ricevo questo errore nell'applicazione:

Un'eccezione di un'attività non è stata osservata né dall'attesa sull'attività né dall'accesso alla relativa proprietà di eccezione. Di conseguenza, l'eccezione non osservata è stata ripubblicata dal thread del finalizzatore.

E 'collegato a uiScheduler? La soluzione alla domanda simile è fondamentalmente quello che sto facendo 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

risposta

6

È necessario gestire in realtà (o almeno osservare) eccezione:

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); 

Questo perché di questa linea del documentation on exception handling in the TPL:

Se non si attende un'attività che propaga un'eccezione o accede alla relativa proprietà Exception, l'eccezione viene escalizzata in base alla politica delle eccezioni .NET quando l'attività viene raccolta tramite garbage.

Nel tuo caso, si ha una continuazione, ma non si è mai effettivamente "attendere sull'eccezione" o accedere alla sua proprietà di eccezione. Il motivo per cui la mia risposta (nella domanda correlata che hai postato) funziona è che in realtà sono utilizzando la proprietà Exception sull'attività passata attraverso la continuazione.

+0

Microsoft ha modificato la politica delle eccezioni .NET da quando è stata scritta questa risposta. Vedi le eccezioni inosservate su https://msdn.microsoft.com/en-us/library/hh367887.aspx#core –