C# aggiornamento entity

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.

Pubblicato da

Andrea Merlin

Laureato in informatica, diversi corsi di specializzazione legati allo Sviluppo Software e alla Computer forensics. Appassionato di nuove tecnologie, amo la programmazione, la Business Intelligence e tematiche legate alla Privacy.Sempre alla ricerca di nuove idee, stimoli … e progetti da seguire!Amo trascorrere il tempo libero in Val Borbera, un piccolo angolo del Piemonte, in provincia di Alessandria.