Effettuare chiamate asincrone con il namespace System.Threading

di Cristian Civera, in UserScript, ASP.NET, System.Threading,

Nello script #440 si è visto come far eseguire operazioni al server senza che l'utente debba aspettare l'avvenuta esecuzione dell'operazione.
I delegates offrono un metodo rapido e semplice, ma ne esiste un che da' il medesimo risultato e offre maggiori potenzialità di controllo.
Basta utilizzare il namespace System.Threading ed in particolare la classe Thread.
Ecco un piccolo esempio:

<%@ Page Language="VB" %>
<%@ Import namespace="System.IO" %>
<%@ Import namespace="System.Text" %>
<%@ Import namespace="System.Threading" %>
<script runat="server">

Private Sub Funzione()
  ScriviFile("inizio")
  'fermo il thread temporaneamente per 10 secondi
  Thread.Sleep(10000)
  ScriviFile("fine")
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\thread\" & 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 Page_Load(Sender as object, e as EventArgs)
  Dim t as New Thread(AddressOf Funzione)
  t.Start()
End Sub
</script>
Prova metodo in un nuovo thread

Nell'esempio, appena sia avvia l'elaborazione della pagina viene creato un nuovo Thread mediante il suo costruttore che accetta un puntatore alla nostra funzione (in C# in mancanza di addressOf si usa la classe ThreadStart).
Per mezzo del metodo Start avviamo il thread con le relative istruzioni. A differenza delle chiamate asincrone il thread una volta eseguita la procedura esce e viene terminato.
Questo strumento è molto potente, perché possiamo tramite la variabile t mantenere il riferimento al thread anche tra più postback o tra più utenti e di conseguenza accedere alle sue proprietà e metodi. Possiamo infatti attendere con il metodo Join che il nuovo thread finisca prima di andare avanti con il thread principale, sospenderlo con Suspend, interromperlo definitivamente con Abort, addormentarlo per un tot di secondi con Sleep, impostare la sua priorità e sapere qual è il suo stato con la proprietà ThreadState.
Questo è solo un accenno sulle funzionalità multithreading che .NET offre. Sebbene non sia possibile passare dei parametri alla funzione faccio notare che le variabili sono visibili per tutti i Thread che creiamo. Occorre quindi prestare attenzione nell'accedere contemporaneamente ad una variabile perché potremmo avere dei risultati diversi da quelli che attendiamo. In questo caso bisogna procedere alla sincronizzazione delle istruzioni.

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