Ci sono due modi per farlo, in base alla versione della lingua che si sta utilizzando.
C# 5.0 e superiori
È possibile utilizzare i async
e await
parole chiave per semplificare una grande quantità di questo per voi.
async
e await
sono stati introdotti nella lingua di semplificare utilizzando il Task Parallel Library, impedisce di dover utilizzare ContinueWith
e che consente di continuare a programmare in modo top-down.
A causa di questo, si può semplicemente utilizzare un blocco try
/catch
per intercettare l'eccezione, in questo modo:
try
{
// Start the task.
var task = Task.Factory.StartNew<StateObject>(() => { /* action */ });
// Await the task.
await task;
}
catch (Exception e)
{
// Perform cleanup here.
}
Si noti che il metodo di incapsulare quanto sopra mosto uso hanno la parola async
applicata in modo da poter utilizzare await
.
C# 4.0 e di seguito
È possibile gestire le eccezioni utilizzando il ContinueWith
overload che prende un valore dal TaskContinuationOptions
enumeration, in questo modo:
// Get the task.
var task = Task.Factory.StartNew<StateObject>(() => { /* action */ });
// For error handling.
task.ContinueWith(t => { /* error handling */ }, context,
TaskContinuationOptions.OnlyOnFaulted);
La OnlyOnFaulted
membro del TaskContinuationOptions
enumerazione indica che la continuazione dovrebbe solo essere eseguito se l'attività antecedente ha generato un'eccezione.
Naturalmente, è possibile avere più di una chiamata alla ContinueWith
fuori lo stesso antecedente, si occupano del caso non eccezionale:
// Get the task.
var task = new Task<StateObject>(() => { /* action */ });
// For error handling.
task.ContinueWith(t => { /* error handling */ }, context,
TaskContinuationOptions.OnlyOnFaulted);
// If it succeeded.
task.ContinueWith(t => { /* on success */ }, context,
TaskContinuationOptions.OnlyOnRanToCompletion);
// Run task.
task.Start();
Come faresti a conoscere il tipo di eccezione nel metodo anonimo? Se faccio t.Exception, intellisense non esporrà la proprietà di eccitazione, messaggio ... ecc ... – guiomie
@guiomie 't' * è * l'eccezione. – casperOne
contesto non è definito di cosa si tratta? – MonsterMMORPG