Multithreading in ASP.NET 2

di: Sosan Abou Assalè     14 Febbraio 2007

Il Thread Pool

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.

Un esempio pratico

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

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 .

Guide ASP.Net

Guida Windows Azure Code Snippets

Le migliori pratiche per far girare le applicazioni "in the cloud",...

Guida ASP.NET MVC Best Practices

Un workflow dettagliato e ricco di suggerimenti pratici per...

Guida ASP.NET Starter Kit

Un modo semplice per imparare ad utilizzare le tecnologie Microsoft...

Altre guide

Newsletter @Microsoft Dev

Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Progettazione database

11 Maggio 2012 a Milano
Disponibilità: 6 Posti

Amministratore di Reti Windows Server 2008

11 Giugno 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto