Pooling dei thread
Aggiornamento: novembre 2007
Il pooling dei thread è una forma di multithreading che prevede l'aggiunta di attività a una coda e l'avvio automatico di tali attività nel corso della creazione dei thread. Quando si esegue il pooling dei thread, si chiama il metodo ThreadPool.QueueUserWorkItem con un delegato per la procedura che si desidera eseguire e tramite Visual Basic viene creato il thread ed eseguita la procedura.
Esempio di pooling dei thread
Nell'esempio seguente viene illustrato come utilizzare il pooling dei thread per avviare svariate attività.
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
Sub SomeLongTask(ByVal state As Object)
' Insert code to perform a long task.
End Sub
Sub AnotherLongTask(ByVal state As Object)
' Insert code to perform another long task.
End Sub
Il pooling dei thread risulta utile quando si desidera avviare più attività distinte, senza impostare singolarmente le proprietà di ogni thread. All'avvio, ogni thread dispone di una dimensione dello stack e di una priorità predefinite. Per impostazione predefinita, è possibile eseguire fino a 25 thread del pool di thread per processore di sistema. Eventuali thread aggiuntivi possono essere accodati, ma non verranno avviati fino al termine degli altri thread.
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.
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 valore Questa 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
Concetti
Multithreading avanzato con Visual Basic
Operazioni multithread con form e controlli