Tutti, ci sono molte domande sull'argomento sopra, ma credo che questo sia sufficientemente diverso da giustificare una nuova domanda. Ho il seguente Task
e una continuazione per gestire una varietà di attività Status
; TaskStatus.RanToCompletion
, TaskStatus.Canceled
e, naturalmente, lo via TaskStatus.Faulted
. Il codice è simileTPL e gestione delle eccezioni
Task<bool> asyncTask = Task.Factory.StartNew<bool>(() =>
asyncMethod(uiScheduler, token, someBoolean), token);
asyncTask.ContinueWith(task =>
{
// Check task status.
switch (task.Status)
{
// Handle any exceptions to prevent UnobservedTaskException.
case TaskStatus.RanToCompletion:
if (asyncTask.Result)
{
// Do stuff...
}
break;
case TaskStatus.Faulted:
if (task.Exception != null)
mainForm.progressRightLabelText = task.Exception.InnerException.Message;
else
mainForm.progressRightLabelText = "Operation failed!";
default:
break;
}
}
Questo tutto funziona bene, ma sono preoccupato anche se non sto facendo questo diritto, in quanto v'è la possibilità di un AggregateException
gettati dentro la continuazione - che cosa allora?
Io non voglio Wait
sul mio asyncTask
né la continuazione in quanto ciò bloccherà il ritorno al thread UI. Per intercettare eventuali eccezioni generate dall'interno di una continuazione non può significare che devo fare una cosa del genere sicuramente
Task parentTask = Task.Factory.startNew(() =>
{
Task<bool> asyncTask = Task.Factory.StartNew<bool>(() =>
asyncMethod(uiScheduler, token, someBoolean), token);
Task continueTask = asyncTask.ContinueWith(task =>
{
// My continuation stuff...
}
try
{
continueTask.Wait();
}
catch(AggregateException aggEx)
{
// Some handling here...
}
});
Sarebbe questo anche il lavoro? Qual è la migliore pratica qui?
Come sempre, grazie per il vostro tempo.
Ho visto attività che "corsero al completamento" quando in realtà hanno lanciato un'eccezione Aggregate. Questo tipo di gestione degli errori non funziona. Perché non usare solo un try/catch? –
Intendi nel metodo chiamato sul thread in background o nel metodo di deleghe di continuazione effettivo? – MoonKnight