Programmazione asincrona deadlock

in C#, Informatica, Programmazione

Programmazione Asincrona eccezioni multiple

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.