di: Sosan Abou Assalè 14 Febbraio 2007
Il .NET Framework fornisce la possibilità di creare applicativi multithreaded e, attraverso IIS (Internet Information Service), rende disponibile ad ogni applicazione ASP.NET un thread pool.
Per evitare la creazione di un thread per ogni singola richiesta con il thread pool si utilizza un insieme finito di thread da cui prelevare i vari thread per eseguire le richieste.
Quindi, non è necessario creare un nuovo thread, perché quando ci occorre, la nostra applicazione ne otterrà uno dal thread pool.
Non appena il thread completa la sua esecuzione verrà restituito al thread pool in attesa di essere riutilizzato per una nuova operazione, anziché essere distrutto.
Questo riutilizzo rende la nostra applicazione più performante e riduce il costo di un eccessiva creazione e distruzione di thread.
Eseguiamo in un thread separato del thread pool, un'operazione potenzialmente lunga. Creiamo una nuova applicazione web e una pagina che chiamiamo "default.aspx".
La prima cosa da fare è includere il namespace System.Threading per poter creare i nuovi thread, mentre il namespace System.IO ci occorre per poter effettuare le operazioni di lettura/scrittura su file.
Imports System.Threading Imports System.IO
Ora creiamo la procedura che verrà eseguita in background in un thread separato visto che potrebbe impegnare molta memoria.
Listato 2. Procedura "impegnativa"
Private Sub Scrivi100MilaRighe(ByVal s As Object)
Dim i As Integer
Dim sw As StreamWriter = New StreamWriter("c:\taskNuovo.txt")
For i = 0 To 100000
sw.WriteLine("questa è una riga" & " - Data: " + DateTime.Now.ToString() & _
" millisecondi:" & DateTime.Now.Millisecond.ToString())
Next
sw.WriteLine(" - FINE : " + DateTime.Now.ToString() & " millisecondi:" & DateTime.Now.Millisecond.ToString())
sw.Close()
End Sub
Trasciniamo un pulsante nella nostra pagina e lo chiamiamo "Button1" e sul click del pulsante aggiungiamo il codice che lancia l'esecuzione della procedura Scrivi1000MilaRighe() in un thread del pool e poi stampa a video un messaggio.
Listato 2. Pagina multithread
Class _Default Inherits System.Web.UI.Page
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
If ThreadPool.QueueUserWorkItem(AddressOf Scrivi100MilaRighe) Then
Label2.Text = " Accodato nel thread pool </br>" & _
DateTime.Now.ToString() & " millisecondi:" & DateTime.Now.Millisecond.ToString()
Else
Label2.Text = "Si è verificato un errore, impossibile accodare nel thread pool"
End If
End Sub
End Class
Abbiamo utilizzato la funzione ThreadPool.QueueUserWorkItem per eseguire la nostra procedura in un thread del thread pool. Il parametro passato alla funzione è la funzione che deve essere eseguita. Nel nostro caso è Scrivi100MilaRighe. La funzione viene eseguita quando un thread del pool di thread diventa disponibile. ThreadPool.QueueUserWorkItem restituisce il valore true se l'operazione di accodamento ha avuto successo.
Figura 2. L'applicazione multithreaded in esecuzione
Il thread è stato accodato nel thread pool ed è stato eseguito.
Nota: nel nostro esempio abbiamo utilizzato semplicemente l'operatore AddressOf per passare il metodo di callback a QueueUserWorkItem omettendo il costruttore WaitCallback perché Visual Basic chiama automaticamente il costruttore delegato corretto.
Il delegato WaitCallback rappresenta infatti il metodo di callback che deve essere eseguito da un thread del pool .
Guida Windows Azure Code SnippetsLe migliori pratiche per far girare le applicazioni "in the cloud",... |
Guida ASP.NET MVC Best PracticesUn workflow dettagliato e ricco di suggerimenti pratici per... |
Guida ASP.NET Starter KitUn modo semplice per imparare ad utilizzare le tecnologie Microsoft... |
Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.
Iscriviti alla newsletter
|
|
Corso Progettazione database11 Maggio 2012 a Milano |
|
|
Amministratore di Reti Windows Server 200811 Giugno 2012 a Milano |
|
Nessun corso previsto |