Справочная информация. Обычный метод, с помощью которого пул потоков .NET управляет потоками, может быть громоздким. Он хорошо работает для ограничения проблем, вызванных конфликтом ресурсов, но делает это за счет того, насколько быстро создаются потоки. Чтобы повысить производительность обработки рабочих потоков с помощью пула потоков, разработчики предусмотрели механизм, который позволяет создавать определенное небольшое количество потоков без прохождения процесса очереди.
SetMinThreads() указывает количество потоков, которые должны быть просто созданы «по запросу», то есть просто запущены без каких-либо проверок текущего количества потоков или постановки в очередь для медленного дросселирования.
Что произойдет, так это то, что фреймворк немедленно создаст первые два потока, как если бы вы вручную настроили их и отключили их с помощью Thread.Start. Кроме того, до текущего значения MaxThreads фреймворк начнет ставить в очередь запросы на рабочие потоки и запускать их с заданным интервалом (по умолчанию 250 мс, думаю, это тоже можно настроить), чтобы избежать конфликта ресурсов. Причина этого в том, что если вы представляете зацикленное поведение запуска потока, который обращается к ресурсу, выполняет некоторые вычисления, а затем записывает результат куда-то еще, вы можете увидеть, как 5 потоков, запускающихся почти одновременно, вызовут тупик при попытке получить к этому первому ресурсу. При достижении порога MaxThreads очередь останавливается; новые потоки не создаются, пока не завершится один.
Таким образом, по характеру вашего кода будет запланировано 50 отдельных рабочих задач, но не все 50 будут выполняться одновременно; среда выполнения позволит запустить два сразу, затем подождите 250 мс или пока не закончится один, прежде чем запустить следующий. Поскольку потоки будут выполняться и завершаться менее чем за 250 мс, вы вряд ли увидите одновременное выполнение более двух рабочих потоков; ожидание перед созданием этого третьего никогда не произойдет, потому что «неограниченный» рабочий поток освобождается первым, а тот, который ожидал, запускается до истечения времени его ожидания, затем часы сбрасываются со следующим.
person
KeithS
schedule
21.02.2011