Pooling von Threads
Aktualisiert: November 2007
Das Pooling von Threads ist eine Form des Multithreadings, bei der Aufgaben in eine Warteschlange eingefügt und sofort bei der Erstellung von Threads automatisch gestartet werden. Beim Pooling von Threads rufen Sie die ThreadPool.QueueUserWorkItem-Methode mit einem Delegaten für die auszuführende Prozedur auf. Visual Basic erstellt dann die Threads und führt die Prozedur aus.
Beispiel zum Pooling von Threads
Das folgende Beispiel zeigt, wie Sie durch Pooling von Threads mehrere Tasks starten können.
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
Das Pooling von Threads ist sinnvoll, wenn Sie mehrere separate Aufgaben starten möchten, ohne die Eigenschaften jedes Threads einzeln festlegen zu müssen. Jeder Thread wird mit einer standarmäßigen Stapelgröße und Priorität gestartet. Bis zu 25 Threadpool-Threads können standardmäßig pro Systemprozessor ausgeführt werden. Über diesen Grenzwert hinaus können zusätzliche Threads in der Warteschlange platziert werden, die jedoch erst gestartet werden, nachdem andere Threads abgeschlossen sind.
Ein Vorteil des Poolings von Threads besteht darin, dass Sie Argumente in einem Statusobjekt an die Aufgabenprozedur übergeben können. Wenn die aufzurufende Prozedur mehr als ein Argument erfordert, können Sie eine Struktur oder eine Instanz einer Klasse in einen Object-Datentyp umwandeln.
Threadpoolparameter und -rückgabewerte
Die Rückgabe von Werten aus einem Threadpool-Thread ist nicht ganz einfach. Das Standardverfahren für die Rückgabe von Werten aus einem Funktionsaufruf ist nicht zulässig, da Sub-Prozeduren der einzige Prozedurtyp sind, der in der Warteschlange für einen Threadpool platziert werden kann. Eine Möglichkeit für die Angabe von Parametern und Rückgabewerten besteht darin, die Parameter, Rückgabewerte und Methoden in einer Wrapperklasse einzuschließen, wie unter Parameter und Rückgabewerte für Multithreadprozeduren beschrieben.
Ein einfacheres Verfahren ist die Verwendung der optionalen ByVal-Zustandsobjektvariable der QueueUserWorkItem-Methode. Wenn Sie diese Variable verwenden, um einen Verweis auf eine Instanz einer Klasse zu übergeben, können die Member der Instanz durch den Threadpool-Thread geändert und als Rückgabewerte verwendet werden.
Es mag zunächst nicht einleuchten, dass Sie ein Objekt ändern können, auf das eine Variable verweist, die als Wert übergeben wird. Dies ist möglich, da nur der Objektverweis als Wert übergeben wird. Wenn Sie die Member des Objekts ändern, auf das der Objektverweis verweist, werden die Änderungen auf die tatsächliche Klasseninstanz angewendet.
Strukturen können nicht für die Rückgabe von Werten in Statusobjekten verwendet werden. Da Strukturen Werttypen sind, wirken sich Änderungen, die der asynchrone Prozess durchführt, nicht auf die Member der ursprünglichen Struktur aus. Verwenden Sie Strukturen, um Parameter bereitzustellen, wenn keine Rückgabewerte benötigt werden.
Siehe auch
Konzepte
Erweitertes Multithreading mit Visual Basic
Multithreading bei Formularen und Steuerelementen