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