я хочу иметь метку времени для входа в систему проект Windows Mobile. Точность должна быть в диапазоне ста миллисекундами, по крайней мере.
Однако мой вызов к DateTime.Now
возвраты a DateTime
объект с Millisecond
набор свойств для обнуления. Также Ticks
свойство округлено соответственно.
Как получить лучшую точность времени?
Помните, что мой код работает на Компактной Платформе, версии 3.5. Я использую сенсорное устройство Pro 2 HTC.
На основе ответа от MusiGenesis я создал следующий класс, который решил эту проблему:
/// <summary>
/// A more precisely implementation of some DateTime properties on mobile devices.
/// </summary>
/// <devdoc>Tested on a HTC Touch Pro2.</devdoc>
public static class DateTimePrecisely
{
/// <summary>
/// Remembers the start time when this model was created.
/// </summary>
private static DateTime _start = DateTime.Now;
/// <summary>
/// Remembers the system uptime ticks when this model was created. This
/// serves as a more precise time provider as DateTime.Now can do.
/// </summary>
private static int _startTick = Environment.TickCount;
/// <summary>
/// Gets a DateTime object that is set exactly to the current date and time on this computer, expressed as the local time.
/// </summary>
/// <returns></returns>
public static DateTime Now
{
get
{
return _start.AddMilliseconds(Environment.TickCount - _startTick);
}
}
}
Environment.TickCount
вернет количество миллисекунд, в течение которых Windows (или Windows Mobile) работала с момента последней перезагрузки.
Чтобы использовать это, добавьте эти две переменные уровня формы в свой код:
private DateTime _start;
private int _startTick;
В событии Load вашей формы сделайте следующее:
private void Form1_Load(object sender, EventArgs e)
{
_start = DateTime.Now;
_startTick = Environment.TickCount;
}
Когда вам понадобится объект DateTime с миллисекундами, сделайте следующее:
DateTime timeStamp =
_start.AddMilliseconds(Environment.TickCount - _startTick);
Environment. TickCount
- это int
, и это значение будет "обернуто" до Int32.MinValue
примерно через 25 дней. Если ваше устройство будет работать так долго без перезапуска, вы захотите добавить проверку для значения Environment.TickCount
, которое меньше последнего прочитанного значения, и сбросить оба _start
и _startTick
, если это так.
Основной альтернативой является класс System.Diagnostics.Stopwatch.
Он доступен в CE, но обратите внимание на свойство IsHighResolution
. Вероятно, на вашем устройстве оно равно False, но проверьте.
Это настолько точно, насколько вы можете получить без P/Invoke.