Время выполнения в .net и игнорирование времени спящего режима ОС - PullRequest
1 голос
/ 08 сентября 2011

Мы пытаемся включить некоторое время кода в наше приложение и столкнулись с потенциальной проблемой. Мы хотели бы, чтобы время было надежным, чтобы периоды, в течение которых компьютер находился в спящем режиме, приостанавливались, что давало бы нам более точное время активного использования. Мы работали с различными методами BCL и P / Invoke (Environment.TickCount, DateTime.UtcNow, Stopwatch, QueryPerformanceCounter (который, я думаю, использует секундомер внутренне, если доступен) и timeGetTime (из winnm.dll, mmtimer.dll или core.dll)) но все они продолжают подсчет тиков во время сна компьютера.

Существуют ли надежные вызовы BCL или P / Invoke, которые будут считать фактическое время выполнения и паузу, пока операционная система находится в спящем режиме?

Я полагаю, что альтернативой может быть использование одного из вышеперечисленных методов и сохранение внутреннего периодического тика, который может учитывать "дыры" во времени (которые могут указывать на период гибернации), но это кажется несколько громоздким и подверженным ошибкам внедрить и проверить.

РЕДАКТИРОВАТЬ: По запросу я добавлю немного фона. Мы создаем небольшую библиотеку для определения времени использования функций в приложениях. Мы хотели бы избежать зависимости от сторонних решений, поэтому нам нужно придерживаться чего-то в BCL (или P / Invoke, хотя мы хотели бы избежать этого). Мы получили некоторую обратную связь о том, что некоторые из наших временных параметров были недействительными, и обнаружили, что мы не знали о том факте, что наш временной код не был устойчив к гибернации в операционной системе. Поэтому мы ищем решение, обеспечивающее фактическое время выполнения программы. Мы не ищем использование ЦП или аналогичных счетчиков более низкого уровня, нам нужен способ измерить фактическое время выполнения функции, и мы не рассматриваем спящую операционную систему как время выполнения.

1 Ответ

0 голосов
/ 18 марта 2019

Вы можете зарегистрироваться для уведомления, когда система находится в спящем режиме, используя функцию RegisterSuspendResumeNotification:

Возможно, вы также захотите получать уведомления, когда рабочая станция заблокирована, экранная заставка запущена или рабочий стол переключает пользователя с помощью быстрого переключения пользователей, используя службу уведомлений о системных событиях:

...