Pooling von Threads (C#)Thread Pooling (C#)

Ein Threadpool ist eine Auflistung von Threads, die verwendet werden kann, um verschiedene Aufgaben im Hintergrund auszuführen.A thread pool is a collection of threads that can be used to perform several tasks in the background. (Weitere Hintergrundinformationen finden Sie unter Threading (C#).) Dies lässt den primären Thread frei, um andere Aufgaben asynchron auszuführen.(See Threading (C#) for background information.) This leaves the primary thread free to perform other tasks asynchronously.

Threadpools werden häufig in Serveranwendungen verwendet.Thread pools are often employed in server applications. Jede eingehende Anforderung wird einem Thread aus dem Threadpool zugeordnet, sodass die Anforderung asynchron verarbeitet werden kann, ohne den primären Thread zu beschäftigen oder die Verarbeitung von nachfolgenden Anforderungen zu verzögern.Each incoming request is assigned to a thread from the thread pool, so that the request can be processed asynchronously, without tying up the primary thread or delaying the processing of subsequent requests.

Wenn ein Thread im Pool seine Aufgabe abgeschlossen hat, wird er an eine Warteschlange von wartenden Threads zurückgegeben, in der er wiederverwendet werden.Once a thread in the pool completes its task, it is returned to a queue of waiting threads, where it can be reused. Aufgrund der Wiederverwendung müssen Anwendungen nicht für jede Aufgabe einen neuen Threads erstellen.This reuse enables applications to avoid the cost of creating a new thread for each task.

Threadpools haben in der Regel eine maximale Anzahl von Threads.Thread pools typically have a maximum number of threads. Wenn alle Threads aktiv sind, werden zusätzliche Aufgaben in die Warteschlange eingereiht, bis sie von wieder verfügbaren Threads verarbeitet werden können.If all the threads are busy, additional tasks are put in queue until they can be serviced as threads become available.

Sie können einen eigenen Threadpool implementieren. Es ist allerdings einfacher, den Threadpool zu verwenden, der von .NET Framework durch die ThreadPool-Klasse bereitgestellt wird.You can implement your own thread pool, but it is easier to use the thread pool provided by the .NET Framework through the ThreadPool class.

Beim Pooling von Threads rufen Sie die ThreadPool.QueueUserWorkItem-Methode mit einem Delegat für die Prozedur auf, die Sie ausführen wollen. C# erstellt dann den Thread und führt Ihre Prozedur aus.With thread pooling, you call the ThreadPool.QueueUserWorkItem method with a delegate for the procedure you want to run, and C# creates the thread and runs your procedure.

Beispiele zum Pooling von ThreadsThread Pooling Example

Das folgende Beispiel zeigt, wie Sie das Pooling von Threads zum Starten von mehreren Aufgaben verwenden können.The following example shows how you can use thread pooling to start several tasks.

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.  
}  

Ein Vorteil des Poolings von Threads ist, dass Sie Argumente in einem Zustandsobjekt an die Aufgabenprozedur übergeben können.One advantage of thread pooling is that you can pass arguments in a state object to the task procedure. Wenn die aufgerufene Prozedur mehr als ein Argument erfordert, können Sie eine Struktur oder eine Instanz einer Klasse in einen Object-Datentyp umwandeln.If the procedure you are calling requires more than one argument, you can cast a structure or an instance of a class into an Object data type.

Parameter und Rückgabewerte des ThreadpoolsThread Pool Parameters and Return Values

Die Rückgabe von Werten aus einem Thread des Threadpools ist nicht einfach.Returning values from a thread-pool thread is not straightforward. Das Standardverfahren für die Rückgabe von Werten von einem Funktionsaufruf ist nicht zulässig, da Sub-Prozeduren die einzigen Typen der Prozedur sind, die in einem Threadpool in die Warteschlagen gestellt werden können.The standard way of returning values from a function call is not allowed because Sub procedures are the only type of procedure that can be queued to a thread pool. Eine Möglichkeit, wie Sie Parameter und Rückgabewerte bereitstellen können, besteht darin, die Parameter, Rückgabewerte und Methoden in einer Wrapperklasse zu umschließen, wie in Parameters and Return Values for Multithreaded Procedures (C#) (Parameter und Rückgabewerte für Multithreadprozeduren (C#)) beschrieben wird.One way you can provide parameters and return values is by wrapping the parameters, return values, and methods in a wrapper class as described in Parameters and Return Values for Multithreaded Procedures (C#).

Ein einfacherer Weg zum Bereitstellen von Parametern und Rückgabewerten besteht darin, die optionale Zustandsobjektvariable ByVal der QueueUserWorkItem-Methode zu verwenden.An easer way to provide parameters and return values is by using the optional ByVal state object variable of the QueueUserWorkItem method. Wenn Sie diese Variable verwenden, um einen Verweis an eine Instanz einer Klasse zu übergeben, können die Member der Instanz durch den Thread des Threadpools geändert und als Rückgabewerte verwendet werden.If you use this variable to pass a reference to an instance of a class, the members of the instance can be modified by the thread-pool thread and used as return values.

Es liegt nicht unbedingt auf der Hand, dass Sie ein Objekt ändern können, auf das von einer als Wert übergebenen Variable verwiesen wurde.At first it may not be obvious that you can modify an object referred to by a variable that is passed by value. Dies ist allein möglich, da nur der Objektverweis als Wert übergeben wird.You can do this because only the object reference is passed by value. Wenn Sie Member des Objekts ändern, auf das vom Objektverweis verwiesen wurde, werden die Änderungen auf die eigentliche Klasseninstanz angewendet.When you make changes to members of the object referred to by the object reference, the changes apply to the actual class instance.

Strukturen können nicht zum Zurückgeben von Werten in Zustandsobjekten verwendet werden.Structures cannot be used to return values inside state objects. Da Strukturen Werttypen sind, haben Änderungen, die der asynchrone Prozess vornimmt, keine Auswirkungen auf die Elemente der ursprünglichen Struktur.Because structures are value types, changes that the asynchronous process makes do not change the members of the original structure. Verwenden Sie Strukturen, um Parameter bereitzustellen, wenn keine Rückgabewerte erforderlich sind.Use structures to provide parameters when return values are not needed.

Siehe auchSee Also

QueueUserWorkItem
System.Threading
ThreadPool
Vorgehensweise: Verwenden eines Threadpools (C#)How to: Use a Thread Pool (C#)
Threading (C#)Threading (C#)
Multithreaded Applications (C#) (Multithreadanwendungen (C#))Multithreaded Applications (C#)
Threadsynchronisierung (C#)Thread Synchronization (C#)