Прежде всего, вы должны понимать, что чрезвычайно трудно, если не невозможно, установить точную синхронизацию на компьютере из-за ограничений, выставляемых как аппаратным, так и программным обеспечением. Хорошая новость заключается в том, что такого родаточности редко требуется.Десять тиков - это безумно маленький промежуток времени.В этот интервал ЦП выполняет очень мало работы, и он никогда не будет статистически значимым.
Для справки, тактовая частота Windows имеет точность около 10 миллисекунд (меньше в более ранних версиях).Оборачивать ваш код звонками на DateTime.UtcNow
лучше не получится.
В своем вопросе вы говорите о желании «поднять событие».Проблема заключается в том, что единственным типом объекта учета времени, который вызывает событие через определенные промежутки времени, является объект Timer
.Он доступен в 3 различных воплощениях в .NET Framework (System.Timers.Timer
, System.Threading.Timer
и System.Windows.Forms.Timer
), каждый из которых имеет свои собственныеуникальные сценарии использования и относительные причуды, но ни один из них не гарантирует точность, близкую к тому, что вы запрашиваете .Они даже не предназначены для этого, и при этом не существует каких-либо эквивалентных функций, предоставляемых Windows API, которые будут обеспечивать такой тип точности.
Причина, по которой я спросил, почему вы хотели это сделать, иесли вы пытаетесь провести эталонный тест, это потому, что это меняет всю игру..NET Framework (начиная с версии 2.0) предоставляет объект Stopwatch
, который специально разработан для точного измерения прошедшего времени в таких ситуациях, как сравнительный анализ или профилирование производительности.Stopwatch
просто объединяет функции Windows API QueryPerformanceFrequency
и QueryPerformanceCounter
(что должно подтвердить мое предложение относительно его предполагаемого использования).Раньше нам приходилось использовать P / Invoke для этих функций, чтобы получить доступ к функциям такого типа в более ранних версиях Framework, но теперь он удобно встроен. Если вам нужен таймер с относительно высоким разрешением для бенчмаркинга, Stopwatch
Ваш лучший выбор. Теоретически, он может предоставить вам субмикросекундную синхронизацию.
Но это не без проблем.Он не вызывает никаких событий, поэтому, если ваш текущий дизайн основан на обработке событий, вам придется переосмыслить его.И, также не гарантируется, что он будет абсолютно точным. Конечно, он может иметь максимально возможное разрешение с учетом аппаратных ограничений, но это не значит, что он обязательно будет соответствовать вашим заявленным требованиям.,Например, это может быть ненадежно в многопроцессорной системе, где Start
и Stop
должны выполняться на одном процессоре.Это не должно иметь значения, но это имеет значение .Кроме того, может быть ненадежным на процессорах, которые могут снижать тактовую частоту вверх и вниз.И даже смею упомянуть, что сам вызов QueryPerformanceCounter
займет некоторое время - около 5 микросекунд даже на современном процессоре с тактовой частотой 2 ГГц, что не позволяет вам на самом деле достичь той субмикросекундной синхронизации, которая звучит хорошо втеория.Опять же, любой разумный профилировщик кода посчитал бы это время незначительным, потому что, ну, это .
(см. Также: http://www.devsource.com/c/a/Techniques/High-Performance-Timing-under-Windows/2/)