Gestire eccezioni all’interno di codice asincrono non sempre porta ai risultati attesi. Analizziamo il seguente codice asincrono
public static Task<int> Foo()
{
return Task<int>.Factory.StartNew(() => {
throw new Exception("From Foo!");
});
}
public static Task<int> Bar()
{
return Task<int>.Factory.StartNew(() =>
{
throw new Exception("From Bar!");
});
}
si tratta di due funzioni asincrone che generano un’eccezione. Come per i metodi sincroni è possibile combinare chiamate di tipo asincrono. Possiamo ad esempio scrivere:
public static async Task<int> Caclulate()
{
return await Foo() + await Bar();
}
cioè un nuovo metodo asincrono che ritorna la somma dei due int, restituiti dall’esecuzione dei metodi precedenti. Quello che ci aspettiamo è la generazione di entrambe le eccezioni (dal momento che vengono effettuate le due chiamate). Quello che accade è però una la completa mancanza della gestione della seconda eccezione: ci saremmo aspettati un’eccezione aggregata contentente entrambe. Questo tipo di comportamento si verifica a causa della natura asincrona dei metodi, che vengono eseguiti in thread separati.