Ручной ResetEvent медленный на некоторых системах (_exitRequestEvent.WaitOne(1, false));

давно используемое программное обеспечение, развернутое на многих серверах, имеет проблему при новой установке. Кажется, это связано с Windows 2016 Server, но мы не уверены. Части программного обеспечения часто вызывают событие ManualResetEvent, например: _exitRequestEvent.WaitOne(1, false); К сожалению, в серверной системе это занимает в 15 раз больше времени, чем в ноутбуке разработчика. Мы обновили dotnet Framework, дополнительно установили SDK и, наконец, Visual Studio, чтобы устранить различия между блокнотами разработчиков и Сервером. Без изменений. Также вызовы Monitor.Wait кажутся намного медленнее. У кого-нибудь есть подобный опыт?

Таргетфреймворк 4.6.2

Спасибо за подсказки, Фрэнк


person abrams    schedule 14.11.2019    source источник
comment
Сколько времени это займет, полностью зависит от того, сколько активных потоков конкурирует за обслуживание. Обычно это всегда будет намного больше на сервере, чем на ноутбуке. Если вы не можете выделить сервер для запуска только вашей программы, это не является чем-то необычным, учитывая адекватные суммы в долларах.   -  person Hans Passant    schedule 14.11.2019
comment
Можете ли вы определить в 15 раз дольше в реальном времени? Вызов _exitRequestEvent.WaitOne(1, false); будет ждать, пока либо не будет сообщено ManualResetEvent (другой частью вашего кода, вызывающего _exitRequestEvent.Set()), либо 1 миллисекунда, в зависимости от того, что наступит раньше. Так вы говорите, что это занимает 15 мс?   -  person Gabriel Luci    schedule 14.11.2019
comment
@GabrielLuci Да, на самом деле на моей (и двух других) машинах он работает чуть выше 1 мс, на другом сервере с 2016 года он превышает 15 мс. У нас был сервер 2012 года, который был быстрее, но я не получил результатов тестов.   -  person abrams    schedule 14.11.2019
comment
@HansPassant Я смог воспроизвести его на свежеустановленном сервере с дополнительным SQL-сервером. На моем ноутбуке программное обеспечение работало в визуальной студии в режиме отладки рядом с офисом, внешним видом, командами и браузерами. Я предполагаю, что количество потоков на моем ноутбуке было намного больше, чем на сервере, на котором выполнялся тест. Само поведение Thread было простым, два потока в одном процессе.   -  person abrams    schedule 14.11.2019
comment
Ответ здесь может быть уместным: stackoverflow.com/a/3961849/224370   -  person Ian Mercer    schedule 14.11.2019
comment
@ianmercer большое спасибо, я думаю, это хороший момент! Я буду исследовать немного больше в этом направлении.   -  person abrams    schedule 14.11.2019
comment
Еще раз проверил примечание @IanMercer, следующий код: while (true) { int start = Environment.TickCount; System.Threading.Thread.Sleep(2); int result = Environment.TickCount - a; } на моем ноутбуке часто отображается 0, иногда 15, на сервере каждый раз 15, иногда больше. Для меня это выглядит так, что наименьшее время планировщика на сервере составляет 15 мс.   -  person abrams    schedule 15.11.2019