Effettuare chiamate asincrone con i delegates di .NET

di Cristian Civera, in ASP.NET, System.Delegate, VB.NET,

Il .NET Framework mette a disposizione una funzionalità avanzata e molto utile sia nelle applicazioni winforms che ASP.NET: i delegates
Un delegate non è altro che una classe che eredita da System.Delegate ed è un puntatore ad funzione o sub. Oltre ad eseguire delle istruzioni contenute in procedure in modo sincrono, permette di effettuare chiamate in modo asincrono. Ciò vuol dire che le istruzioni in esso contenute vengono eseguite su un thread diverso, senza influenzare quindi il thread principale, che restituirà la pagina HTML all'utente. In questo modo il visitatore non dovrà attendere l?avvenuta esecuzione delle istruzioni.
Ecco un esempio che chiama una sub in modo asincrono e scrive su due file l'ora in cui è iniziata e finita l'operazione:

<%@ Page debug="true" %>
<%@ Import namespace="System.IO" %>
<%@ Import namespace="System.Text" %>
<script runat="server">


Private Delegate Sub MioDelegate(ByVal param as String)

Private Sub Funzione(ByVal param as String)
 ScriviFile("inizio")
 'fermo il thread temporaneamente per 10 secondi
 System.Threading.Thread.Sleep(10000)
End Sub

Private Sub ScriviFile(ByVal filename as String)
 'scrive su un file l'ora in cui avviene
 'l'inizio e la fine della nostra funzione
 'correggere il percorso del file
 Dim file as New FileStream("C:\Inetpub\wwwroot\prove\async\" & filename & ".txt",FileMode.Create)
 Dim data as Byte()=Encoding.Ascii.GetBytes(DateTime.Now)
 file.Write(data,0,data.Length)
 file.Close
End Sub

Private Sub FunzioneCallback(ar as IAsyncResult)
 'termino la chiamata asincrona
 Dim d as MioDelegate=Ctype(ar.AsyncState,MioDelegate)
 d.EndInvoke(ar)
  ScriviFile("fine")
End Sub

Private Sub Page_Load(Sender as object, e as EventArgs)
 'creo il delegate verso la mia funzione
 Dim d as New MioDelegate(AddressOf Funzione)
 'invoco il metodo
 d.BeginInvoke("parametro",New AsyncCallBack(AddressOf FunzioneCallback),d)
 'd("parametro")
 'd.Invoke("parametro")
End Sub
</script>

E' possibile invocare un delegate in modo sincrono sia come una normale sub o funzione (nell'esempio: d() ) o utilizzando il relativo metodo Invoke. Una volta termina la procedura viene chiamata la sub di callback per terminare definitivamente la chiamata asincrona. Nel caso il delegate fosse una funzione, il metodo EndInvoke restituisce il valore.
E' utile far notare che i delegates possono puntare anche a più funzioni o sub con la medesima firma. Basta utilizzare il metodo statico Combine della classe Delegate che unisce un delegate o un array di delegates ad un altro e con un'unica istruzione si eseguono più delegates.
Una solutione del genere può ritornare utile ad esempio per lanciare l'esecuzione di operazioni che potrebbero andare in timeout e di cui non si vuole dare subito notifica all'utente.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi