Поделиться через


ThreadPool.SetMinThreads(Int32, Int32) Метод

Определение

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

public:
 static bool SetMinThreads(int workerThreads, int completionPortThreads);
public static bool SetMinThreads (int workerThreads, int completionPortThreads);
static member SetMinThreads : int * int -> bool
Public Shared Function SetMinThreads (workerThreads As Integer, completionPortThreads As Integer) As Boolean

Параметры

workerThreads
Int32

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

completionPortThreads
Int32

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

Возвращаемое значение

Значение true, если изменение выполнено успешно; в противном случае — значение false.

Примеры

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

using namespace System;
using namespace System::Threading;
int main()
{
   int minWorker;
   int minIOC;
   
   // Get the current settings.
   ThreadPool::GetMinThreads( minWorker, minIOC );
   
   // Change the minimum number of worker threads to four, but
   // keep the old setting for minimum asynchronous I/O
   // completion threads.
   if ( ThreadPool::SetMinThreads( 4, minIOC ) )
   {
      
      // The minimum number of threads was set successfully.
   }
   else
   {
      
      // The minimum number of threads was not changed.
   }
}
using System;
using System.Threading;

public class Test
{
    public static void Main()
    {
        int minWorker, minIOC;
        // Get the current settings.
        ThreadPool.GetMinThreads(out minWorker, out minIOC);
        // Change the minimum number of worker threads to four, but
        // keep the old setting for minimum asynchronous I/O 
        // completion threads.
        if (ThreadPool.SetMinThreads(4, minIOC))
        {
            // The minimum number of threads was set successfully.
        }
        else
        {
            // The minimum number of threads was not changed.
        }
    }
}
Imports System.Threading

Public Class Test

    <MTAThread> _
    Public Shared Sub Main()
        Dim minWorker, minIOC As Integer
        ' Get the current settings.
        ThreadPool.GetMinThreads(minWorker, minIOC)
        ' Change the minimum number of worker threads to four, but
        ' keep the old setting for minimum asynchronous I/O 
        ' completion threads.
        If ThreadPool.SetMinThreads(4, minIOC) Then
            ' The minimum number of threads was set successfully.
        Else
            ' The minimum number of threads was not changed.
        End If
    End Sub
End Class

Комментарии

Этот метод не поддерживается, если пул потоков Windows настроен для использования вместо пула потоков .NET. Дополнительные сведения см. в разделе Настройка конфигурации пула потоков Windows.

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

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

Если указать отрицательное число или число больше максимального числа активных потоков пула (полученных с помощью GetMaxThreads), SetMinThreads возвращается false и не изменяется ни одно из минимальных значений.

По умолчанию минимальное количество потоков равно количеству процессоров. Можно использовать для SetMinThreads увеличения минимального количества потоков, например для временного решения проблем, из-за которых некоторые рабочие элементы в очереди или задачи блокируют потоки пула потоков. Эти блокировки иногда приводят к ситуации, когда все рабочие потоки или потоки завершения ввода-вывода блокируются (голод). Однако увеличение минимального числа потоков может снизить производительность другими способами, например:

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

Внимание!

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

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

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