ThreadPool ThreadPool ThreadPool ThreadPool Class

Определение

Предоставляет пул потоков, который можно использовать для выполнения задач, отправки рабочих элементов, обработки асинхронного ввода-вывода, ожидания от имени других потоков и обработки таймеров. 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
Наследование
ThreadPoolThreadPoolThreadPoolThreadPool

Примеры

В следующем примере основного потока приложения помещает метод с именем ThreadProc для выполнения в потоке пула потоков, бездействует одной секунде, а затем завершает работу.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. ThreadProc Метод просто отображает сообщение.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.

Если закомментировать вызов Thread.Sleep метод, основной поток завершает работу до выполнения метода в потоке пула потоков.If you comment out the call to the Thread.Sleep method, the main thread exits before method runs on the thread pool thread. Пул потоков использует фоновые потоки, которые не смогут обеспечить работоспособность приложения при всех основных потоков завершены.The thread pool uses background threads, which do not keep the application running if all foreground threads have terminated. (Это простой пример гонки).(This is a simple example of a race condition.)

Комментарии

Многие приложения создают потоки, которые тратить много времени в состоянии, ожидая возникновения события.Many applications create threads that spend a great deal of time in the sleeping state, waiting for an event to occur. Другие потоки могут входить в бездействующее состояние только для периодически опрашивать для изменения или обновлять сведения о состоянии.Other threads might enter a sleeping state only to be awakened periodically to poll for a change or update status information. Пул потоков позволяет более эффективно использовать потоки, предоставляя приложения с пулом рабочих потоков, управляемых системой.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. Следующие примеры операций, использующих потоки пула потоков.Examples of operations that use thread pool threads include the following:

  • При создании Task или Task<TResult> объект асинхронно, выполнить ряд задач по умолчанию, задача запланирована для выполнения в потоке пула потоков.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.

  • Асинхронные таймеры используют пул потоков.Asynchronous timers use the thread pool. Потоки из пула потоков исполнения ответных вызовов из System.Threading.Timer класса и вызов событий из System.Timers.Timer класса.Thread pool threads execute callbacks from the System.Threading.Timer class and raise events from the System.Timers.Timer class.

  • При использовании дескрипторов ожидания, зарегистрированных в потоке операционной системы следит за состоянием дескрипторов ожидания.When you use registered wait handles, a system thread monitors the status of the wait handles. При завершении операции ожидания, рабочий поток из пула потоков выполняет соответствующую функцию обратного вызова.When a wait operation completes, a worker thread from the thread pool executes the corresponding callback function.

  • При вызове QueueUserWorkItem метод в очередь метод для выполнения в потоке пула потоков.When you call the QueueUserWorkItem method to queue a method for execution on a thread pool thread. Это можно сделать, передавая ему WaitCallback делегировать.You do this by passing the method a WaitCallback delegate. Делегат имеет сигнатуруThe delegate has the signature

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

    где state — это объект, содержащий данные, используемые делегатом.where state is an object that contains data to be used by the delegate. Фактические данные могут передаваться делегата путем вызова QueueUserWorkItem(WaitCallback, Object) метод.The actual data can be passed to the delegate by calling the QueueUserWorkItem(WaitCallback, Object) method.

Примечание

Потоки в пул управляемых потоков — это фоновые потоки.The threads in the managed thread pool are background threads. То есть их IsBackground свойства являются true.That is, their IsBackground properties are true. Это означает, что ThreadPool поток не будет поддерживать работу после все основные потоки освободят приложения.This means that a ThreadPool thread will not keep an application running after all foreground threads have exited.

Важно!

Когда пул потоков повторно использует поток, он не очищает данные в локальном хранилище потока или в поля, помеченные атрибутом ThreadStaticAttribute атрибута.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. Таким образом, когда метод проверяет локальное хранилище потока или полей, будут отмечены ThreadStaticAttribute атрибут, значения, он находит может остаться после более ранних версий используйте потока из пула потоков.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.

Также можно поместить в очередь рабочие элементы, не относящиеся к операции ожидания в пул потоков.You can also queue work items that are not related to a wait operation to the thread pool. Чтобы запросить, что рабочий элемент должен обрабатываться потоком в пуле потоков, вызовите QueueUserWorkItem метод.To request that a work item be handled by a thread in the thread pool, call the QueueUserWorkItem method. Этот метод принимает в качестве параметра ссылку на метод или делегат, который будет вызываться в потоке из пула потоков.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. Нет способа отмены рабочего элемента, после его находится в очереди.There is no way to cancel a work item after it has been queued.

Таймеры очереди и зарегистрированные операции ожидания также используют пул потоков.Timer-queue timers and registered wait operations also use the thread pool. Их функции обратного вызова помещаются в очередь в пул потоков.Their callback functions are queued to the thread pool.

Имеется один пул потоков каждого процесса.There is one thread pool per process. Начиная с .NET Framework 4.NET Framework 4 размер по умолчанию пула потоков для процесса зависит от нескольких факторов, таких как размер виртуального адресного пространства.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. Процесс может вызвать метод GetMaxThreads для определения количества потоков.A process can call the GetMaxThreads method to determine the number of threads. Число потоков в пуле потоков может быть изменен с помощью SetMaxThreads метод.The number of threads in the thread pool can be changed by using the SetMaxThreads method. Каждый поток использует размер стека по умолчанию и выполняется с приоритетом по умолчанию.Each thread uses the default stack size and runs at the default priority.

Примечание

Неуправляемый код, на котором размещается платформа .NET Framework можно изменить размер пула потоков с помощью CorSetMaxThreads функции, определенной в файле mscoree.h.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.

Пул потоков предоставляет новые рабочие потоки или потоки завершения ввода-вывода по запросу, пока не будет достигнуто минимальное значение для каждой категории.The thread pool provides new worker threads or I/O completion threads on demand until it reaches the minimum for each category. При достижении минимума пул потоков можно создавать дополнительные потоки в этой категории или дождитесь завершения выполнения некоторых задач.When a minimum is reached, the thread pool can create additional threads in that category or wait until some tasks complete. Начиная с .NET Framework 4.NET Framework 4 пул потоков создает и уничтожает рабочие потоки в целях оптимизации пропускной способности, которая определяется как количество задач, завершаемых за единицу времени.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. Слишком малое количество потоков может препятствовать оптимальному использованию доступных ресурсов, тогда как слишком большое их количество может усиливать конкуренцию за ресурсы.Too few threads might not make optimal use of available resources, whereas too many threads could increase resource contention.

Примечание

Если потребность низкая, фактическое количество потоков из пула потоков может быть ниже минимальных значений.When demand is low, the actual number of thread pool threads can fall below the minimum values.

Для получения этих минимальных значений можно использовать метод GetMinThreads.You can use the GetMinThreads method to obtain these minimum values.

Внимание!

Можно использовать SetMinThreads метод, чтобы увеличить минимальное количество потоков.You can use the SetMinThreads method to increase the minimum number of threads. Однако необоснованное увеличение этих значений может привести к снижению производительности.However, unnecessarily increasing these values can cause performance problems. Если одновременно запускается слишком много задач, все они могут выполняться слишком медленно.If too many tasks start at the same time, all of them might appear to be slow. В большинстве случаев пул потоков работает наилучшим образом, если он использует собственный алгоритм выделения потоков.In most cases the thread pool will perform better with its own algorithm for allocating threads.

Методы

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

Связывает дескриптор операционной системы с объектом ThreadPool. Binds an operating system handle to the ThreadPool.

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

Связывает дескриптор операционной системы с объектом ThreadPool. Binds an operating system handle to the ThreadPool.

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

Возвращает разницу между максимальным числом потоков пула, возвращаемых методом GetMaxThreads(Int32, Int32), и числом активных в данный момент потоков. 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)

Возвращает количество запросов к пулу потоков, которые могут быть активными одновременно. Retrieves the number of requests to the thread pool that can be active concurrently. Все запросы, превышающие это количество, остаются в очереди до тех пор, пока потоки пула не станут доступны. 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)

Возвращает минимальное число потоков, создаваемых пулом потоков по требованию по мере поступления новых запросов перед переходом на алгоритм управления созданием и уничтожением потоков. 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)

Помещает метод в очередь на выполнение. Queues a method for execution. Метод выполняется, когда становится доступен поток из пула потоков. The method executes when a thread pool thread becomes available.

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

Помещает метод в очередь на выполнение и указывает объект, содержащий данные для использования методом. Queues a method for execution, and specifies an object containing data to be used by the method. Метод выполняется, когда становится доступен поток из пула потоков. 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)

Регистрирует делегат для ожидания объекта WaitHandle, задавая время ожидания в миллисекундах в виде 32-разрядного целого числа без знака. 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)

Регистрирует делегат для ожидания объекта WaitHandle, задавая значение TimeSpan для времени ожидания. 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)

Регистрирует делегат для ожидания объекта WaitHandle, задавая время ожидания в миллисекундах в виде 64-разрядного целого числа со знаком. 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)

Регистрирует делегат для ожидания объекта WaitHandle, задавая время ожидания в миллисекундах в виде 32-разрядного целого числа со знаком. 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)

Задает количество запросов к пулу потоков, которые могут быть активными одновременно. Sets the number of requests to the thread pool that can be active concurrently. Все запросы, превышающие это количество, остаются в очереди до тех пор, пока потоки пула не станут доступны. 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)

Задает минимальное число потоков, создаваемых пулом потоков по требованию по мере поступления новых запросов перед переходом на алгоритм управления созданием и уничтожением потоков. 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*)

Помещает в очередь на выполнение операцию перекрывающегося ввода-вывода. Queues an overlapped I/O operation for execution.

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

Помещает указанный делегат в очередь пула потоков, но не распространяет вызывающий стек на рабочий поток. 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)

Регистрирует делегат для ожидания объекта WaitHandle, задавая время ожидания в миллисекундах в виде 32-разрядного целого числа со знаком. Registers a delegate to wait for a WaitHandle, using a 32-bit signed integer for the time-out in milliseconds. Этот метод не распространяет вызывающий стек на рабочий поток. 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)

Регистрирует делегат для ожидания объекта WaitHandle, задавая время ожидания в миллисекундах в виде 64-разрядного целого числа со знаком. Registers a delegate to wait for a WaitHandle, specifying a 64-bit signed integer for the time-out in milliseconds. Этот метод не распространяет вызывающий стек на рабочий поток. 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)

Регистрирует делегат для ожидания объекта WaitHandle, задавая значение TimeSpan для времени ожидания. Этот метод не распространяет вызывающий стек на рабочий поток. 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)

Регистрирует делегат для ожидания объекта WaitHandle, задавая время ожидания в миллисекундах в виде 32-разрядного целого числа без знака. Registers a delegate to wait for a WaitHandle, specifying a 32-bit unsigned integer for the time-out in milliseconds. Этот метод не распространяет вызывающий стек на рабочий поток. This method does not propagate the calling stack to the worker thread.

Применяется к

Потокобезопасность

Данный тип потокобезопасен. This type is thread safe.

См. также