Миллисекунды в DateTime.Now на .NET Compact Framework всегда равны нулю?

Я хочу иметь метку времени для журналов в проекте Windows Mobile. Точность должна составлять не менее ста миллисекунд.

Однако мой вызов DateTime.Now возвращает объект DateTime с свойством Millisecond, равным нулю. Также свойство Ticks округляется соответственно.

Как повысить точность времени?
Помните, что мой код работает на Compact Framework версии 3.5. Я использую устройство HTC touch Pro 2.

Основываясь на ответе от 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);
        }
    }
}

Ответы

Ответ 1

Environment.TickCount вернет число миллисекунд, которое Windows (или Windows Mobile) было запущено с момента последней перезагрузки.

Чтобы использовать это, добавьте эти два переменных уровня формы в свой код:

private DateTime _start;
private int _startTick;

В вашей форме Загрузите событие, сделайте следующее:

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, которое меньше, чем последнее прочитанное значение, и reset как _start, так и _startTick, если это так.

Ответ 4

Основной альтернативой является класс System.Diagnostics.Stopwatch.

Он доступен в CE, но обратите внимание на свойство IsHighResolution. Вероятно, это False на вашем устройстве, но проверьте.

Это так же точно, как вы получите без P/Invoke.

Ответ 5

В обычной версии v2.0 вы можете использовать DateTime.Now.ToString( "yyyy-MM-dd HH: mm: ss.fff" ), чтобы получить miliseconds. Больше f означает большую точность.