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