C# aggiornamento entity

in C#, Informatica, Programmazione

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.