Я написал программу, которая использует все доступные ядра, используя Parallel.ForEach
. Список для ForEach
содержит ~ 1000 объектов и вычисление для каждого объекта занимает некоторое время (~ 10 секунд).
В этом случае я настраиваю таймер следующим образом:
timer = new System.Timers.Timer();
timer.Elapsed += TimerHandler;
timer.Interval = 15000;
timer.Enabled = true;
private void TimerHandler(object source, ElapsedEventArgs e)
{
Console.WriteLine(DateTime.Now + ": Timer fired");
}
В настоящий момент метод TimerHandler
является заглушкой, чтобы убедиться, что проблема не вызвана этим методом.
Я ожидал, что метод TimerHandler
будет выполняться каждые ~ 15 секунд. Однако время между двумя вызовами этого метода достигает даже 40 секунд, поэтому слишком много секунд.
Используя new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount -1 }
для метода Parallel.ForEach
, этого не происходит, и ожидается ожидаемый интервал в 15 секунд.
Предполагается ли, что я должен убедиться, что на активный таймер всегда есть одно ядро? Кажется, это немного странно даже больше, потому что "зарезервированный" может быть ценным ресурсом для моих вычислений.
Изменить: как указано в настройке Юваля, фиксированный минимум потоков в пуле на ThreadPool.SetMinThreads
решил проблему. Я также пробовал new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }
(поэтому без -1
в начальном вопросе) для метода Parallel.ForEach
, и это также решает проблему. Однако у меня нет хорошего объяснения, почему эти модификации решили проблему. Возможно, было создано столько потоков, что поток таймера только что "потерялся" для "длительного" времени, пока он не будет выполнен снова.