Condividi tramite


Creazione di pool di thread (C# e Visual Basic)

Un pool di thread è una raccolta di thread che è possibile utilizzare per eseguire diverse attività in background.Per informazioni complementari, vedere Threading (C# e Visual Basic). In questo modo il thread primario è libero di eseguire altre attività in modo asincrono.

I pool di thread vengono spesso utilizzati nelle applicazioni server.Ad ogni richiesta in arrivo viene assegnato un thread del pool. In questo modo la richiesta può essere elaborata in modo asincrono, senza bloccare il thread primario o ritardare l'elaborazione delle richieste successive.

Una volta completata l'attività, il thread del pool torna in una coda di thread in attesa, dove potrà essere riutilizzatoevitando in questo modo la necessità di creare un nuovo thread per ogni attività.

Esiste in genere un numero massimo di thread che è possibile inserire in un pool.Se tutti i thread sono occupati, le altre attività vengono inserite in coda finché non potranno essere eseguite dai thread che si renderanno disponibili.

È possibile implementare un pool di thread personalizzato, ma risulta più agevole utilizzare quello fornito con .NET Framework tramite la classe ThreadPool.

Per creare un pool di thread, si chiama il metodo ThreadPool.QueueUserWorkItem con un delegato per la routine che si desidera eseguire e tramite Visual Basic o C# si crea il thread ed esegue la routine.

Esempio di pooling dei thread

Nell'esempio seguente viene illustrato come utilizzare il pooling dei thread per avviare svariate attività.

Public Sub DoWork()
    ' Queue a task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        New System.Threading.WaitCallback(AddressOf SomeLongTask))
    ' Queue another task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        New System.Threading.WaitCallback(AddressOf AnotherLongTask))
End Sub
Private Sub SomeLongTask(ByVal state As Object)
    ' Insert code to perform a long task.
End Sub
Private Sub AnotherLongTask(ByVal state As Object)
    ' Insert code to perform another long task.
End Sub
public void DoWork()
{
    // Queue a task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        new System.Threading.WaitCallback(SomeLongTask));
    // Queue another task.
    System.Threading.ThreadPool.QueueUserWorkItem(
        new System.Threading.WaitCallback(AnotherLongTask));
}

private void SomeLongTask(Object state)
{
    // Insert code to perform a long task.
}

private void AnotherLongTask(Object state)
{
    // Insert code to perform a long task.
}

Uno dei vantaggi offerti dal pooling dei thread consiste nella possibilità di passare argomenti in un oggetto di stato alla routine di attività.Se per la routine chiamata è necessario più di un argomento, è possibile eseguire il cast di una struttura o un'istanza di una classe in un tipo di dati Object.

Parametri e valori restituiti del pool di thread

La restituzione di valori da un thread del pool di thread non risulta semplicissima.Non è possibile avvalersi della soluzione standard per la restituzione di valori da una chiamata di funzione, poiché in un pool di thread possono essere accodate solo le routine Sub.Un modo per fornire parametri e restituire valori è incapsulando i parametri, i valori di restituzione e i metodi in una classe wrapper come descritto in Parametri e valori restituiti per routine multithreading (C# e Visual Basic).

Una soluzione più semplice per fornire parametri e valori restituiti consiste nell'utilizzo della variabile facoltativa dell'oggetto di stato ByVal del metodo QueueUserWorkItem.Se si utilizza tale variabile per passare un riferimento a un'istanza di una classe, i membri dell'istanza potranno essere modificati dal thread del pool di thread e utilizzati come valori restituiti.

La modifica di un oggetto a cui fa riferimento una variabile passata per valoreQuesta operazione può essere eseguita perché solo il riferimento oggetto viene inviato dal valore.Quando si apportano modifiche ai membri dell'oggetto indicato dal riferimento all'oggetto, le modifiche vengono applicate all'istanza di classe effettiva.

Non è possibile utilizzare le strutture per restituire valori all'interno di oggetti di stato.Poiché le strutture sono tipi valore, le modifiche apportate dal processo asincrono non comportano la modifica dei membri della struttura originale.Utilizzare le strutture per fornire parametri nei casi in cui non sono necessari i valori restituiti.

Vedere anche

Attività

Procedura: utilizzare un pool di thread (C# e Visual Basic)

Riferimenti

Sincronizzazione di thread (C# e Visual Basic)

QueueUserWorkItem

System.Threading

ThreadPool

Concetti

Applicazioni multithreading (C# e Visual Basic)

Altre risorse

Threading (C# e Visual Basic)

HOW TO: Submit a Work Item to the Thread Pool by Using Visual C#