ThreadPool ThreadPool ThreadPool ThreadPool Class

Definition

Stellt einen Threadpool bereit, der verwendet werden kann, um Aufgaben auszuführen, Arbeitsaufgaben bereitzustellen, asynchrone E/A zu verarbeiten, im Auftrag anderer Threads zu warten und Zeitgeber zu verarbeiten. Provides a pool of threads that can be used to execute tasks, post work items, process asynchronous I/O, wait on behalf of other threads, and process timers.

public ref class ThreadPool abstract sealed
public static class ThreadPool
type ThreadPool = class
Public Class ThreadPool
Vererbung
ThreadPoolThreadPoolThreadPoolThreadPool

Beispiele

Im folgenden Beispiel stellt eine Methode namens Thread der hauptanwendung Warteschlange ThreadProc zum Ausführen auf einem Thread eines Threadpools, ruht für eine Sekunde, und klicken Sie dann beendet wird.In the following example, the main application thread queues a method named ThreadProc to execute on a thread pool thread, sleeps for one second, and then exits. Die ThreadProc Methode zeigt einfach eine Nachricht an.The ThreadProc method simply displays a message.

using namespace System;
using namespace System::Threading;

ref class Example
{
public:

   // This thread procedure performs the task.
   static void ThreadProc(Object^ stateInfo)
   {
      
      // No state object was passed to QueueUserWorkItem, so stateInfo is 0.
      Console::WriteLine( "Hello from the thread pool." );
   }
};

int main()
{
   // Queue the task.
   ThreadPool::QueueUserWorkItem(gcnew WaitCallback(Example::ThreadProc));

   Console::WriteLine("Main thread does some work, then sleeps.");
   
   Thread::Sleep(1000);
   Console::WriteLine("Main thread exits.");
   return 0;
}
// The example displays output like the following:
//       Main thread does some work, then sleeps.
//       Hello from the thread pool.
//       Main thread exits.
using System;
using System.Threading;

public class Example 
{
    public static void Main() 
    {
        // Queue the task.
        ThreadPool.QueueUserWorkItem(ThreadProc);
        Console.WriteLine("Main thread does some work, then sleeps.");
        Thread.Sleep(1000);

        Console.WriteLine("Main thread exits.");
    }

    // This thread procedure performs the task.
    static void ThreadProc(Object stateInfo) 
    {
        // No state object was passed to QueueUserWorkItem, so stateInfo is null.
        Console.WriteLine("Hello from the thread pool.");
    }
}
// The example displays output like the following:
//       Main thread does some work, then sleeps.
//       Hello from the thread pool.
//       Main thread exits.
Imports System.Threading

Public Module Example
    Public Sub Main()
        ' Queue the work for execution.
        ThreadPool.QueueUserWorkItem(AddressOf ThreadProc)
        
        Console.WriteLine("Main thread does some work, then sleeps.")

        Thread.Sleep(1000)

        Console.WriteLine("Main thread exits.")
    End Sub

    ' This thread procedure performs the task.
    Sub ThreadProc(stateInfo As Object)
        ' No state object was passed to QueueUserWorkItem, so stateInfo is null.
        Console.WriteLine("Hello from the thread pool.")
    End Sub
End Module
' The example displays output like the following:
'       Main thread does some work, then sleeps.
'       Hello from the thread pool.
'       Main thread exits.

Wenn Sie den Aufruf Auskommentieren der Thread.Sleep -Methode der Hauptthread beendet wird, bevor die Methode auf der Threadpool-Thread ausgeführt wird.If you comment out the call to the Thread.Sleep method, the main thread exits before method runs on the thread pool thread. Der Threadpool verwendet Hintergrundthreads, die nicht beibehalten wird, führen Sie die Anwendung ausgeführt wird, wenn alle Vordergrundthreads beendet wurden.The thread pool uses background threads, which do not keep the application running if all foreground threads have terminated. (Dies ist ein einfaches Beispiel einer Racebedingung.)(This is a simple example of a race condition.)

Hinweise

Viele Anwendungen erstellen, Threads, die verbringen viel Zeit in den inaktiven Zustand Eintreten eines Ereignisses gewartet wird.Many applications create threads that spend a great deal of time in the sleeping state, waiting for an event to occur. Andere Threads könnten einen inaktiven Status nur für die in regelmäßigen Abständen aktiviert werden, um Abfragen für eine Änderung oder Aktualisieren von Statusinformationen eingeben.Other threads might enter a sleeping state only to be awakened periodically to poll for a change or update status information. Der Threadpool können Sie Threads effizienter durch die Bereitstellung Ihrer Anwendung mit einem Pool von Arbeitsthreads, die vom System verwaltet werden.The thread pool enables you to use threads more efficiently by providing your application with a pool of worker threads that are managed by the system. Die folgenden: Beispiele für Vorgänge, die Threads im Threadpool zu verwendenExamples of operations that use thread pool threads include the following:

  • Bei der Erstellung einer Task oder Task<TResult> Objekt einige Aufgaben werden standardmäßig asynchron durchführen der Task zur Ausführung auf einem Threadpool-Thread geplant ist.When you create a Task or Task<TResult> object to perform some task asynchronously, by default the task is scheduled to run on a thread pool thread.

  • Asynchroner Timer verwenden den Threadpool.Asynchronous timers use the thread pool. Threads im Threadpool ausführen Rückrufe aus der System.Threading.Timer Klasse und Auslösen von Ereignissen aus dem System.Timers.Timer Klasse.Thread pool threads execute callbacks from the System.Threading.Timer class and raise events from the System.Timers.Timer class.

  • Bei Verwendung von registrierten Wait-Handles überwacht Systemthread den Status der Wait-Handles.When you use registered wait handles, a system thread monitors the status of the wait handles. Wenn ein Wait-Vorgang abgeschlossen ist, führt ein Arbeitsthread aus dem Threadpool die entsprechenden Callback-Funktion.When a wait operation completes, a worker thread from the thread pool executes the corresponding callback function.

  • Beim Aufrufen der QueueUserWorkItem Methode, um eine Methode für die Ausführung auf einem Threadpool-Thread in die Warteschlange.When you call the QueueUserWorkItem method to queue a method for execution on a thread pool thread. Die Methode übergeben Sie dazu eine WaitCallback delegieren.You do this by passing the method a WaitCallback delegate. Der Delegat besitzt die SignaturThe delegate has the signature

    void WaitCallback(Object state)  
    
    Sub WaitCallback(state As Object)  
    

    wo state ist ein Objekt, das Daten enthält, durch den Delegaten verwendet werden.where state is an object that contains data to be used by the delegate. Die tatsächlichen Daten an den Delegaten übergeben werden können, durch den Aufruf der QueueUserWorkItem(WaitCallback, Object) Methode.The actual data can be passed to the delegate by calling the QueueUserWorkItem(WaitCallback, Object) method.

Hinweis

Die Threads im Pool verwalteten Threads sind Hintergrundthreads.The threads in the managed thread pool are background threads. D. h. deren IsBackground Eigenschaften sind true.That is, their IsBackground properties are true. Dies bedeutet, dass eine ThreadPool Thread hält sich nicht auf eine Anwendung ausgeführt wird, nachdem alle Vordergrundthreads beendet haben.This means that a ThreadPool thread will not keep an application running after all foreground threads have exited.

Wichtig

Wenn der Threadpool einen Thread wiederverwendet, es löscht nicht Daten im threadlokalen Speicher oder mit markierten Felder der ThreadStaticAttribute Attribut.When the thread pool reuses a thread, it does not clear the data in thread local storage or in fields that are marked with the ThreadStaticAttribute attribute. Aus diesem Grund werden, wenn eine Methode untersucht threadlokalen Speicher oder Felder, die mit markiert sind, die ThreadStaticAttribute -Attribut, die gefundenen Werte bleiben daher eventuell über aus einer früheren Verwendung der Threadpool-Thread.Therefore, when a method examines thread local storage or fields that are marked with the ThreadStaticAttribute attribute, the values it finds might be left over from an earlier use of the thread pool thread.

Sie können auch Arbeitselemente Warteschlange, die nicht mit einem "Wait"-Vorgang für den Threadpool verknüpft sind.You can also queue work items that are not related to a wait operation to the thread pool. Um ein Arbeitselement von einem Thread im Threadpool verarbeitet werden, rufen die QueueUserWorkItem Methode.To request that a work item be handled by a thread in the thread pool, call the QueueUserWorkItem method. Diese Methode verwendet als Parameter einen Verweis auf die Methode oder der Delegat, der aufgerufen wird, von dem Thread aus dem Threadpool ausgewählt.This method takes as a parameter a reference to the method or delegate that will be called by the thread selected from the thread pool. Es ist keine Option zum Abbrechen eines Arbeitselements, nachdem es in die Warteschlange gestellt wurde.There is no way to cancel a work item after it has been queued.

Timerwarteschlange Timer und registrierte Wartevorgänge, auch den Threadpool verwenden.Timer-queue timers and registered wait operations also use the thread pool. Die Rückruffunktionen werden an den Threadpool in die Warteschlange eingereiht.Their callback functions are queued to the thread pool.

Es gibt einen Threadpool pro Prozess.There is one thread pool per process. Ab .NET Framework 4.NET Framework 4 ist die Standardgröße des Threadpools für einen Prozess von mehreren Faktoren abhängig, z. B. von der Größe des virtuellen Adressraums.Beginning with the .NET Framework 4.NET Framework 4, the default size of the thread pool for a process depends on several factors, such as the size of the virtual address space. Ein Prozess kann die GetMaxThreads-Methode aufrufen, um die Anzahl der Threads zu bestimmen. A process can call the GetMaxThreads method to determine the number of threads. Die Anzahl der Threads im Threadpool kann geändert werden, mithilfe der SetMaxThreads Methode.The number of threads in the thread pool can be changed by using the SetMaxThreads method. Jeder Thread die Standardstapelgröße verwendet und auf die Standardpriorität ausgeführt wird.Each thread uses the default stack size and runs at the default priority.

Hinweis

Nicht verwaltete Code, der das .NET Framework hostet kann die Größe des Threadpools ändern, indem Sie mit der CorSetMaxThreads Funktion, die in der Datei mscoree.h definiert.Unmanaged code that hosts the .NET Framework can change the size of the thread pool by using the CorSetMaxThreads function, defined in the mscoree.h file.

Der Threadpool stellt neue Workerthreads oder e/a-Abschlussthreads nach Bedarf, bis der Mindestwert für jede Kategorie erreicht.The thread pool provides new worker threads or I/O completion threads on demand until it reaches the minimum for each category. Wenn ein Minimum erreicht ist, kann Threadpool der Warteschleife hinzu Weitere Threads in dieser Kategorie erstellen oder warten Sie, bis einige Aufgaben abgeschlossen sind.When a minimum is reached, the thread pool can create additional threads in that category or wait until some tasks complete. Ab .NET Framework 4.NET Framework 4 erstellt und zerstört der Threadpool Arbeitsthreads, um den Durchsatz zu optimieren. Der Durchsatz ist als die Anzahl der Aufgaben definiert, die pro Zeiteinheit abgeschlossen werden.Beginning with the .NET Framework 4.NET Framework 4, the thread pool creates and destroys worker threads in order to optimize throughput, which is defined as the number of tasks that complete per unit of time. Bei zu wenigen Threads werden die verfügbaren Ressourcen möglicherweise nicht optimal genutzt, wohingegen bei zu vielen Threads Ressourcenkonflikte auftreten können. Too few threads might not make optimal use of available resources, whereas too many threads could increase resource contention.

Hinweis

Wenn die Anforderungen niedrig sind, kann die tatsächliche Anzahl der Threads im Threadpool unterhalb der Mindestwerte liegen.When demand is low, the actual number of thread pool threads can fall below the minimum values.

Sie können die GetMinThreads-Methode verwenden, um diese Mindestwerte abzurufen. You can use the GetMinThreads method to obtain these minimum values.

Achtung

Sie können die SetMinThreads Methode, um die minimale Anzahl von Threads zu erhöhen.You can use the SetMinThreads method to increase the minimum number of threads. Allerdings kann ein unnötiges Erhöhen dieses Wertes zu Leistungsproblemen führen.However, unnecessarily increasing these values can cause performance problems. Wenn zu viele Aufgaben gleichzeitig gestartet werden, werden möglicherweise alle Aufgaben zu langsam ausgeführt.If too many tasks start at the same time, all of them might appear to be slow. In den meisten Fällen erreicht der Threadpool mit dem eigenen Algorithmus für die Zuordnung von Threads eine bessere Leistung.In most cases the thread pool will perform better with its own algorithm for allocating threads.

Methoden

BindHandle(IntPtr) BindHandle(IntPtr) BindHandle(IntPtr) BindHandle(IntPtr)

Bindet ein Betriebssystemhandle an den ThreadPool. Binds an operating system handle to the ThreadPool.

BindHandle(SafeHandle) BindHandle(SafeHandle) BindHandle(SafeHandle) BindHandle(SafeHandle)

Bindet ein Betriebssystemhandle an den ThreadPool. Binds an operating system handle to the ThreadPool.

GetAvailableThreads(Int32, Int32) GetAvailableThreads(Int32, Int32) GetAvailableThreads(Int32, Int32) GetAvailableThreads(Int32, Int32)

Ruft die Differenz zwischen der von der GetMaxThreads(Int32, Int32)-Methode zurückgegebenen maximalen Anzahl der Threads im Threadpool und der Anzahl der gerade aktiven Threads ab. Retrieves the difference between the maximum number of thread pool threads returned by the GetMaxThreads(Int32, Int32) method, and the number currently active.

GetMaxThreads(Int32, Int32) GetMaxThreads(Int32, Int32) GetMaxThreads(Int32, Int32) GetMaxThreads(Int32, Int32)

Ruft die Anzahl der Anforderungen für den Threadpool ab, die gleichzeitig aktiv sein können. Retrieves the number of requests to the thread pool that can be active concurrently. Alle über diese Zahl hinausgehenden Anforderungen bleiben in der Warteschlange, bis die Threads des Threadpools verfügbar sind. All requests above that number remain queued until thread pool threads become available.

GetMinThreads(Int32, Int32) GetMinThreads(Int32, Int32) GetMinThreads(Int32, Int32) GetMinThreads(Int32, Int32)

Ruft die Mindestanzahl von Threads ab, die der Threadpool bei Bedarf erstellt, wenn neue Anforderungen gestellt werden, bevor zu einem Algorithmus zum Verwalten von Threaderstellung und -löschung gewechselt wird. Retrieves the minimum number of threads the thread pool creates on demand, as new requests are made, before switching to an algorithm for managing thread creation and destruction.

QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback) QueueUserWorkItem(WaitCallback)

Fügt der Warteschlange eine auszuführende Methode hinzu. Queues a method for execution. Die Methode wird ausgeführt, wenn ein Thread des Threadpools verfügbar wird. The method executes when a thread pool thread becomes available.

QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object) QueueUserWorkItem(WaitCallback, Object)

Fügt der Warteschlange eine auszuführende Methode hinzu und gibt ein Objekt an, das die von der Methode zu verwendenden Daten enthält. Queues a method for execution, and specifies an object containing data to be used by the method. Die Methode wird ausgeführt, wenn ein Thread des Threadpools verfügbar wird. The method executes when a thread pool thread becomes available.

QueueUserWorkItem<TState>(Action<TState>, TState, Boolean) QueueUserWorkItem<TState>(Action<TState>, TState, Boolean) QueueUserWorkItem<TState>(Action<TState>, TState, Boolean) QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)
RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, wobei für das Timeout in Millisekunden eine 32-Bit-Ganzzahl ohne Vorzeichen angegeben wird. Registers a delegate to wait for a WaitHandle, specifying a 32-bit unsigned integer for the time-out in milliseconds.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Registriert einen Delegaten, der auf ein WaitHandle wartet, und gibt einen TimeSpan-Wert für das Timeout an. Registers a delegate to wait for a WaitHandle, specifying a TimeSpan value for the time-out.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, wobei für das Timeout in Millisekunden eine 64-Bit-Ganzzahl mit Vorzeichen angegeben wird. Registers a delegate to wait for a WaitHandle, specifying a 64-bit signed integer for the time-out in milliseconds.

RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) RegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, wobei für das Timeout in Millisekunden eine 32-Bit-Ganzzahl mit Vorzeichen angegeben wird. Registers a delegate to wait for a WaitHandle, specifying a 32-bit signed integer for the time-out in milliseconds.

SetMaxThreads(Int32, Int32) SetMaxThreads(Int32, Int32) SetMaxThreads(Int32, Int32) SetMaxThreads(Int32, Int32)

Legt die Anzahl der Anforderungen für den Threadpool fest, die gleichzeitig aktiv sein können. Sets the number of requests to the thread pool that can be active concurrently. Alle über diese Zahl hinausgehenden Anforderungen bleiben in der Warteschlange, bis die Threads des Threadpools verfügbar sind. All requests above that number remain queued until thread pool threads become available.

SetMinThreads(Int32, Int32) SetMinThreads(Int32, Int32) SetMinThreads(Int32, Int32) SetMinThreads(Int32, Int32)

Legt die Mindestanzahl von Threads fest, die der Threadpool bei Bedarf erstellt, wenn neue Anforderungen gestellt werden, bevor zu einem Algorithmus zum Verwalten von Threaderstellung und -löschung gewechselt wird. Sets the minimum number of threads the thread pool creates on demand, as new requests are made, before switching to an algorithm for managing thread creation and destruction.

UnsafeQueueNativeOverlapped(NativeOverlapped*) UnsafeQueueNativeOverlapped(NativeOverlapped*) UnsafeQueueNativeOverlapped(NativeOverlapped*) UnsafeQueueNativeOverlapped(NativeOverlapped*)

Stellt einen überlappenden E/A-Vorgang zur Ausführung in die Warteschlange. Queues an overlapped I/O operation for execution.

UnsafeQueueUserWorkItem(WaitCallback, Object) UnsafeQueueUserWorkItem(WaitCallback, Object) UnsafeQueueUserWorkItem(WaitCallback, Object) UnsafeQueueUserWorkItem(WaitCallback, Object)

Stellt den angegebenen Delegaten in eine Warteschlange für den Threadpool, leitet die Aufrufliste jedoch nicht an den Arbeitsthread weiter. Queues the specified delegate to the thread pool, but does not propagate the calling stack to the worker thread.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean) UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)

Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, wobei für das Timeout in Millisekunden eine 32-Bit-Ganzzahl mit Vorzeichen verwendet wird. Registers a delegate to wait for a WaitHandle, using a 32-bit signed integer for the time-out in milliseconds. Diese Methode leitet den aufrufenden Stapel nicht an den Arbeitsthread weiter. This method does not propagate the calling stack to the worker thread.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean) UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)

Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, wobei für das Timeout in Millisekunden eine 64-Bit-Ganzzahl mit Vorzeichen angegeben wird. Registers a delegate to wait for a WaitHandle, specifying a 64-bit signed integer for the time-out in milliseconds. Diese Methode leitet den aufrufenden Stapel nicht an den Arbeitsthread weiter. This method does not propagate the calling stack to the worker thread.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean) UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)

Registriert einen Delegaten, der auf ein WaitHandle wartet, und gibt einen TimeSpan-Wert für das Timeout an. Diese Methode leitet den aufrufenden Stapel nicht an den Arbeitsthread weiter. Registers a delegate to wait for a WaitHandle, specifying a TimeSpan value for the time-out. This method does not propagate the calling stack to the worker thread.

UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean) UnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)

Registriert einen Delegaten, der auf eine WaitHandle-Klasse wartet, wobei für das Timeout in Millisekunden eine 32-Bit-Ganzzahl ohne Vorzeichen angegeben wird. Registers a delegate to wait for a WaitHandle, specifying a 32-bit unsigned integer for the time-out in milliseconds. Diese Methode leitet den aufrufenden Stapel nicht an den Arbeitsthread weiter. This method does not propagate the calling stack to the worker thread.

Gilt für:

Threadsicherheit

Dieser Typ ist threadsicher. This type is thread safe.

Siehe auch