Я пытаюсь понять, как MaxDegreeOfParallelism фактически влияет на параллелизм при вызове Parallel.For. Вот код, с которым я экспериментирую:
static void Main(string[] args)
{
var parallelOptions = new ParallelOptions()
{
MaxDegreeOfParallelism = 1000,
};
Parallel.For(1, 1000, parallelOptions, i =>
{
Console.WriteLine(i);
Thread.Sleep(TimeSpan.FromHours(1));
});
}
Когда я запускаю этот код, я сразу же вижу вывод консоли от 1 до 9 (в течение ~ 0,1 секунды). Затем раз в секунду будет добавляться новое число — 10, 11, 12 и так далее. Между тем, в диспетчере задач Windows я вижу, что количество выполняемых потоков в процессе увеличивается с одним новым потоком в секунду.
Почему с этим кодом я не вижу мгновенного вывода значений от 1 до 1000?
(Я понимаю, что этот код может не иметь никакого смысла и что запускать 1000 потоков на моем ноутбуке, вероятно, плохая идея, но я хочу понять, что здесь происходит)
EDIT: Этот вопрос был, на мой взгляд, неправильно помечен как дубликат. Я понимаю, что MaxDegreeOfParallelism — это максимальная степень параллелизма. Конечно, было бы большое количество переключений контекста, если бы у меня одновременно работало 1000 потоков, но связанный вопрос не объясняет, как это на самом деле работает. Что, если я просто хочу запустить более разумное количество потоков, скажем, 32? Мой компьютер хорошо справляется с этим, но с поведением Parallel.For, описанным выше, требуется ~ 20 секунд, чтобы раскрутить такое количество потоков.