ThreadPool Класс

Определение

Предоставляет пул потоков, которые можно использовать для выполнения задач, публикации рабочих элементов, обработки асинхронных операций ввода-вывода, ожидания от имени других потоков и таймеров обработки.

public ref class ThreadPool abstract sealed
public ref class ThreadPool sealed
public static class ThreadPool
public sealed class ThreadPool
type ThreadPool = class
Public Class ThreadPool
Public NotInheritable Class ThreadPool
Наследование
ThreadPool

Примеры

В следующем примере основной поток приложения очереди метода, именованного ThreadProc для выполнения в потоке пула потоков, спящий в течение одной секунды, а затем завершает работу. Метод ThreadProc просто отображает сообщение.

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

Комментарии

Многие приложения создают потоки, которые тратят много времени в спящем состоянии, ожидая возникновения события. Другие потоки могут входить только в спящее состояние, чтобы периодически проснуться для опроса сведений об изменении или обновлении сведений о состоянии. Пул потоков позволяет эффективнее использовать потоки, предоставляя приложению пул рабочих потоков, управляемых системой. Ниже приведены примеры операций, использующих потоки пула потоков.

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

  • Асинхронные таймеры используют пул потоков. Потоки пула потоков выполняют обратные вызовы из System.Threading.Timer класса и вызывают события из System.Timers.Timer класса.

  • При использовании зарегистрированных дескрипторов ожидания системный поток отслеживает состояние дескрипторов ожидания. После завершения операции ожидания рабочий поток из пула потоков выполняет соответствующую функцию обратного вызова.

  • При вызове QueueUserWorkItem метода очереди метода для выполнения в потоке пула потоков. Для этого передайте метод делегата WaitCallback . Делегат имеет подпись

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

    где state находится объект, содержащий данные, которые будут использоваться делегатом. Фактические данные можно передать делегату QueueUserWorkItem(WaitCallback, Object) , вызвав метод.

Note

Потоки в управляемом пуле потоков являются фоновыми потоками. То есть их IsBackground свойства true. Это означает, что ThreadPool поток не будет поддерживать работу приложения после завершения всех потоков переднего плана.

Important

Когда пул потоков повторно использует поток, он не очищает данные в локальном хранилище потока или в полях, помеченных атрибутом ThreadStaticAttribute . Таким образом, если метод проверяет локальное хранилище потока или поля, помеченные ThreadStaticAttribute атрибутом, значения, которые он находит, могут быть оставлены после предыдущего использования потока пула потоков.

Вы также можете ставить рабочие элементы очереди, которые не связаны с операцией ожидания в пул потоков. Чтобы запросить, чтобы рабочий элемент обрабатывался потоком в пуле потоков, вызовите QueueUserWorkItem метод. Этот метод принимает в качестве параметра ссылку на метод или делегат, который будет вызываться потоком, выбранным из пула потоков. Невозможно отменить рабочий элемент после того, как он был в очереди.

Таймер очереди таймеров и зарегистрированных операций ожидания также используют пул потоков. Их функции обратного вызова помещаются в пул потоков.

Для каждого процесса существует один пул потоков. Начиная с .NET Framework 4, размер пула потоков по умолчанию для процесса зависит от нескольких факторов, таких как размер виртуального адресного пространства. Процесс может вызвать GetMaxThreads метод, чтобы определить количество потоков. Количество потоков в пуле потоков можно изменить с помощью SetMaxThreads метода. Каждый поток использует размер стека по умолчанию и выполняется по умолчанию.

Note

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

Пул потоков предоставляет новые рабочие потоки или потоки завершения ввода-вывода по запросу, пока не достигнет максимального значения для каждой категории. При достижении максимального значения пул потоков может создавать дополнительные потоки в этой категории или ждать завершения некоторых задач. Начиная с .NET Framework 4 пул потоков создает и уничтожает рабочие потоки для оптимизации пропускной способности, которая определяется как количество задач, которые выполняются в единицу времени. Слишком мало потоков может не обеспечить оптимальное использование доступных ресурсов, в то время как слишком много потоков может усилить конкуренцию за ресурсы.

Note

Если спрос низкий, фактическое количество потоков в пуле может быть ниже минимального числа.

Этот метод можно использовать для получения этих минимальных значений GetMinThreads .

Предостережение

Метод можно использовать SetMinThreads для увеличения минимального количества потоков. Однако ненужно увеличение этих значений может привести к проблемам с производительностью. Если слишком много задач начинаются одновременно, все из них могут быть медленными. В большинстве случаев пул потоков будет работать лучше со своим алгоритмом по выделению потоков.

Свойства

Имя Описание
CompletedWorkItemCount

Возвращает количество рабочих элементов, которые были обработаны до сих пор.

PendingWorkItemCount

Возвращает количество рабочих элементов, которые в настоящее время обрабатываются в очереди.

ThreadCount

Возвращает количество потоков пула потоков, которые в настоящее время существуют.

Методы

Имя Описание
BindHandle(IntPtr)
Устаревшие..
Устаревшие..

Привязывает дескриптор операционной системы к дескриптору ThreadPool.

BindHandle(SafeHandle)

Привязывает дескриптор операционной системы к дескриптору ThreadPool.

GetAvailableThreads(Int32, Int32)

Извлекает разницу между максимальным количеством потоков пула потоков, возвращаемых методом GetMaxThreads(Int32, Int32) , и числом, активным в данный момент.

GetMaxThreads(Int32, Int32)

Извлекает количество запросов в пул потоков, которые могут быть активными одновременно. Все запросы выше этого числа остаются в очереди до тех пор, пока потоки пула потоков не становятся доступными.

GetMinThreads(Int32, Int32)

Извлекает минимальное количество потоков, которые пул потоков создает по запросу, так как создаются новые запросы, прежде чем переключаться на алгоритм для управления созданием и уничтожением потоков.

QueueUserWorkItem(WaitCallback, Object)

Помещает метод для выполнения и задает объект, содержащий данные, используемые методом. Метод выполняется, когда поток пула потоков становится доступным.

QueueUserWorkItem(WaitCallback)

Очереди метода для выполнения. Метод выполняется, когда поток пула потоков становится доступным.

QueueUserWorkItem<TState>(Action<TState>, TState, Boolean)

Очередь метода, указанного делегатом Action<T> для выполнения, и предоставляет данные, используемые методом. Метод выполняется, когда поток пула потоков становится доступным.

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

Регистрирует делегат для ожидания, WaitHandleуказав 32-разрядное целое число со знаком для времени ожидания в миллисекундах.

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

Регистрирует делегат для ожидания WaitHandle, указав 64-разрядное целое число со знаком для времени ожидания в миллисекундах.

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

Регистрирует делегат для ожидания WaitHandle, указывая TimeSpan значение времени ожидания.

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

Регистрирует делегат для ожидания в WaitHandleмиллисекундах, указав 32-разрядное целое число без знака для времени ожидания в миллисекундах.

SetMaxThreads(Int32, Int32)

Задает количество запросов в пул потоков, которые могут быть активными одновременно. Все запросы выше этого числа остаются в очереди до тех пор, пока потоки пула потоков не становятся доступными.

SetMinThreads(Int32, Int32)

Задает минимальное количество потоков, которые пул потоков создает по запросу, так как создаются новые запросы, прежде чем переключаться на алгоритм для управления созданием и уничтожением потоков.

UnsafeQueueNativeOverlapped(NativeOverlapped*)

Очереди перекрывающейся операции ввода-вывода для выполнения.

UnsafeQueueUserWorkItem(IThreadPoolWorkItem, Boolean)

Очередь указанного объекта рабочего элемента в пул потоков.

UnsafeQueueUserWorkItem(WaitCallback, Object)

Очередь указанного делегата в пул потоков, но не распространяет стек вызовов в рабочий поток.

UnsafeQueueUserWorkItem<TState>(Action<TState>, TState, Boolean)

Очереди метода, указанного делегатом Action<T> для выполнения, и указывает объект, содержащий данные, используемые методом. Метод выполняется, когда поток пула потоков становится доступным.

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

Регистрирует делегат, чтобы ждать WaitHandle, используя 32-разрядное целое число со знаком для времени ожидания в миллисекундах. Этот метод не распространяет вызывающий стек на рабочий поток.

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

Регистрирует делегат для ожидания WaitHandle, указав 64-разрядное целое число со знаком для времени ожидания в миллисекундах. Этот метод не распространяет вызывающий стек на рабочий поток.

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

Регистрирует делегат для ожидания WaitHandle, указывая TimeSpan значение времени ожидания. Этот метод не распространяет вызывающий стек на рабочий поток.

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

Регистрирует делегат для ожидания в WaitHandleмиллисекундах, указав 32-разрядное целое число без знака для времени ожидания в миллисекундах. Этот метод не распространяет вызывающий стек на рабочий поток.

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

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

Этот тип является потокобезопасной.

См. также раздел