Изменится ли MaxDegreeOfParallelism во время работы моего Parallel.ForEach, или будет установлен первый вызов Utils.Threads () за все время? Заранее спасибо.
Нет, не будет, так как он не продолжает проверять и изменять назначенное значение, которое требуется во время инициализации API. Infact, если вы просматриваете подпись MaxDegreeOfParallelism
,
public int MaxDegreeOfParallelism { get; set; }
, поскольку его тип значения не является ссылочным типом, его integer
, поэтому в любом случае значение копируется, оно никогда не передается для каких-либо изменений в значении, стандартное поведение типов значений
Воздействие MaxDegreeOfParallelism
на Parallel.ForEach
вызов
Это индикатор или подсказка, он не гарантирует, что много параллельных потоков будут выделены из пула до начала выполнения. Для Parallel.ForEach
он всегда начинается с одного потока и добавляет возможность выполнения параллельно, в зависимости от количества задач и времени, которое они занимают.
Это значение также внутренне модерируется, но это не значит, что вы можете предоставить очень высокое значение и ожидать, что будет создано много потоков. Хотя он ведет себя по-разному в случае PLinq
, когда перед обработкой он ожидает, что большинство потоков будет инициализировано / инициализировано, но это может оказать неблагоприятное влияние на производительность, если для каждого потока недостаточно работы из-за переключения контекста
Пара справочных ссылок, касающихся DOP в C # Parallel / PLinq API:
Когда установить максимальную степень параллелизма
Макс. Степень параллелизма для AsParallel ()