Почему тип данных System.Timers.Timer.Interval является двойным? - программирование
Подтвердить что ты не робот

Почему тип данных System.Timers.Timer.Interval является двойным?

Это немного академический вопрос, поскольку я борюсь с мышлением Microsoft, использующим double как тип данных для свойства Interval!

Во-первых, из MDSN Interval - время, в миллисекундах, между прошедшими событиями; Я бы это интерпретировал как дискретное число, поэтому почему использование двойника? наверняка int или long имеет больше смысла!?

Может ли интервал поддерживать значения, такие как 5.768585 (5.768585 мс)? Особенно, если учесть, что System.Timers.Timer не имеет точности почти в миллисекундах... Самый точный таймер в .NET?

Кажется немного глупым для меня.. Может быть, я что-то упустил!

4b9b3361

Ответ 1

Демонтаж показывает, что интервал потребляется по вызову (int)Math.Ceiling(this.interval), поэтому даже если вы должны указать реальное число, перед использованием он будет преобразован в int. Это происходит в методе UpdateTimer.

Почему? Не знаю, возможно, спецификация сказала, что double требуется в какой-то момент, и это изменилось? Конечным результатом является то, что double строго не требуется, потому что он в конечном итоге преобразуется в int и не может превышать Int32.MaxValue в соответствии с документами.

Да, таймер может "поддерживать" реальные цифры, он просто не говорит вам, что он молча изменил их. Вы можете инициализировать и запускать таймер с помощью 100.5d, он превращает его в 101.

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

Ответ 2

Причиной использования двойника здесь является попытка обеспечить достаточную точность.

Подробно: срезы времени прерывания системы даются ActualResolution, который возвращается NtQueryTimerResolution(). NtQueryTimerResolution экспортируется собственной NTDLL.DLL-библиотекой Windows NT. Приращения времени системы задаются функцией TimeIncrement, которая возвращается GetSystemTimeAdjustment().

Эти два значения определяют поведение системных таймеров. Они представляют собой целочисленные значения и выражают 100 нс единиц. Однако это уже недостаточно для определенного оборудования сегодня. На некоторых системах ActualResolution возвращается 9766, что соответствует 0,9766 мс. Но на самом деле эти системы работают с 1024 прерываниями в секунду (настроены надлежащей настройкой мультимедийного интерфейса). 1024 прерываний в секунду приведет к тому, что период прерывания будет равен 0,9765625 мс. Он имеет слишком высокую детализацию, он достигает режима 100 пс и поэтому не может удерживаться в стандартном формате ActualResolution.

Поэтому было решено включить такие временные параметры в двойные. Но: Это означает, что не означает, что все возможные значения поддерживаются/используются. Гранулярность, заданная TimeIncrement, будет сохраняться, несмотря ни на что.

При работе с таймерами всегда желательно посмотреть на детализацию параметров.

Итак, вернемся к вашему вопросу: Can Interval support values like 5.768585 (ms) ?

Нет, система, которую я привел в качестве примера выше, не может.

Но он может поддерживать 5.859375 (мс)!

Другие системы с различным оборудованием могут поддерживать другие номера.

Итак, идея введения двойника здесь не такая глупая идея и на самом деле имеет смысл. Расходы еще на 4 байта, чтобы получить правильные вещи, являются хорошей инвестицией.

Я обобщил некоторые подробности о времени Windows здесь.