5.5 Threadpools
Da es relativ aufwendig ist, einen Thread zu starten, stellt .NET auch einen Pool von wiederverwendbaren Threads zur Verfügung. Sie müssen weder gestartet noch beendet werden; die Verwaltung übernimmt komplett .NET. Standardmäßig sind pro Prozessor 25 Arbeitsthreads (und 1000 I/O-Threads) im Pool. Tabelle 5.11 zeigt die Mitglieder der Poolklasse.
Methode | Beschreibung |
SetMaxThreads(worker As Integer, io As Integer) As Boolean GetMaxThreads(worker As Integer, io As Integer) |
Maximal gleichzeitig mögliche Threads im Pool (Rückgabe: gibt an, ob erfolgreich gesetzt) |
SetMinThreads(worker As Integer, io As Integer) As Boolean GetMinThreads(worker As Integer, io As Integer) |
Mindestzahl an Threads im Pool (Rückgabe: gibt an, ob erfolgreich gesetzt) |
GetAvailableThreads(worker As Integer, io As Integer) |
Gerade verfügbare Threads |
QueueUserWorkItem(call As WaitCallback, state As Object) As Boolean UnsafeQueue...: dito, ohne Sicherheitsprüfungen |
Ausführung von call in Threadpoolthread, ein optionales state wird an call durchgereicht. |
RegisterWaitForSingleObject(w As WaitHandle, call As WaitOrTimerCallback, state As Object, <time>, once As Boolean) As RegisteredWaitHandle UnsafeRegister...: dito, ohne Sicherheitsprüfungen <time>: millisecs As Integer / time As TimeSpan |
Ausführung von call in Threadpoolthread, wenn w signalisiert oder bei Zeitüberschreitung |
UnsafeRegisterWaitForSingleObject |
Wie RegisterWaitForSingle-Object, aber ohne Sicherheitsprüfungen |
BindHandle(osHandle As SafeHandle) As Boolean |
Native I/O-Operation im Pool ausführen |
UnsafeQueueNativeOverlapped( overlapped As NativeOverlapped*) As Boolean |
I/O-Operation ohne Sicherheitsüberprüfung |
Die wichtigste Methode ist QueueUserWorkItem, mit der Sie eine Methode asynchron ausführen. Die Signatur der Methode ist festgelegt.
Public Delegate Sub WaitCallback(state As Object) |
Das folgende Beispiel macht einen Geschwindigkeitsvergleich zwischen normalen Threads und denen aus dem Pool.
'...\ Multitasking\Asynchron\Zeit.vb |
Option Strict On Imports System.Threading Namespace Multitasking Module Zeit Sub Rechnen(ByVal eingabe As Object) nr += 1 End Sub Private nr As Integer Private Const anz As Integer = 100 Private Const tps As Long = TimeSpan.TicksPerSecond Sub Test() ThreadPool.SetMaxThreads(anz, anz * 10) ThreadPool.SetMinThreads(anz, anz * 10) Thread.Sleep(10000) Dim t0 As Date nr = 0 : t0 = Now For i As Integer = 1 To anz ThreadPool.QueueUserWorkItem(AddressOf Rechnen) Next While nr < anz : Thread.Sleep(0) : End While Console.WriteLine("{0} Threadpoolthreads brauchen {1}", _ anz, (Now.Ticks – t0.Ticks) / tps) nr = 0 : t0 = Now For i As Integer = 1 To anz Dim th As New Thread(AddressOf Rechnen) : th.Start() Next While nr < anz : Thread.Sleep(0) : End While Console.WriteLine("{0} Threads brauchen {1}", _ anz, (Now.Ticks – t0.Ticks) / tps) Console.ReadLine() End Sub End Module End Namespace
Die Ausgabe zeigt die große Zeitdifferenz der beiden Arten von Threads. Die genauen Zeiten und das Verhältnis unterliegen großen Schwankungen.
100 Threadpoolthreads brauchen 0,1301872 100 Threads brauchen 2,6137584
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.