Programmazione asincrona con async – await (parte 2)

Dopo il post introduttivo sulla programmazione asincrona in .NET, analizziamo le parole chiave asyncawait, introdotte a partire da C# 5.0. Async e Await consentono di scrivere codice asincrono in modo semplice: il codice  risulta molto simile a quello sincrono, con tutti i vantaggi che ne derivano in termini di gestione di thread. Nella programmazione asincrona vengono generati thread separati, che non permetto di effettuare chiamate non bloccanti.

Continua a leggere Programmazione asincrona con async – await (parte 2)

Programmazione Asincrona e deadlock

Nel refactoring di applicazioni windows form (ebbene si, esistono ancora!) o comunque in quelle applicazioni con lunghi task di elaborazione, uno dei problemi di maggiore impatto per gli utenti è il freeze dell’interfaccia utente.

A partire dal framework 4.5 (C# 5) sono disponibili  le keyword async e await per la scrittura di codice asincrono.  Una delle funzionalità che può essere sfruttata a partire da questa versione (al momento della scrittura di questo articolo è disponibile la release 7.2, ma per questioni legacy non posso upgradare l’applicazione oltre la versione 5.0) è il TAP (Task Async Pattern) .

Task Async Pattern

Utilizzando TAP con async/await è possibile scrivere codice asincrono in maniera semplice senza perdere in potenza. Il seguente metodo consente di eseguire in forma asincrona un metodo (MyMethod) che non lo è.

Per poter ottenere il risultato dell’elaborazione del metodo MyMethodAsync possiamo utilizzare il seguente codice:

L’utilizzo di questo codice all’interno di una console application funziona correttamente. Nel caso in cui la nostra applicazione sia GUI/ASP il risultato è un deadlock. L’esecuzione dovrà essere terminata utilizzando il task manager. 

I metodi asincroni dovrebbe prevenire il blocco delle applicazioni, ma non è sempre così.

Leggendo un pò di documentazione online, ho risolto il problema utilizzando il metodo ConfigureAwait. Questo metodo consente di effettuare l’await del Task su cui stiamo effettuando la configurazione. L’utilizzo del parametro booleano continueOnCapturedContext e dovrà essere impostato a true nel caso in cui sia necessario attendere il ritorno dal context catturato, oppure false nel caso non sia necessario. L’esempio che generava il deadlock può essere rescritto nel seguente modo:

L’utilizzo del metodo ConfigureAwait con continueOnCapturedContext impostato a false consente di risolvere il problema di deadlock.

Programmazione asincrona codice misto

Sviluppando codice asincrono si tende spesso ad implementare buona parte delle funzioni sfruttando le potenzialità fornite dall’utilizzo di async ed await. Un pò come se rendere i comportamenti asincroni fosse in qualche modo “contagioso”.  Se all’interno del codice vengono sviluppate fuzioni sincrone, lo sviluppo “misto” può generare problematiche nel flusso di esecuzione e nelle performance della nostra applicazione.

La migrazione parziale di metodi in modalità asincrona, lasciandone inalterate altre può generare deadlock

Continua a leggere Programmazione asincrona codice misto

Programmazione Asincrona eccezioni multiple

Gestire eccezioni all’interno di codice asincrono non sempre porta ai risultati attesi. Analizziamo il seguente codice asincrono

Continua a leggere Programmazione Asincrona eccezioni multiple

Programmazione Asincrona e void

Uno degli errori da evitare nella programmazione asincrona in c# (tramite async e await) è quello di creare metodi che restituiscono void.

L’utilizzo di metodi asincroni che ritornano uno void (async void) introducono due tipologie di problemi:

  • non è possibile determinare quando il task è stato completato
  • le eccezioni che vengono generate al suo interno producono come risultato la terminazione del processo

Continua a leggere Programmazione Asincrona e void