.NET секундомер в режиме ожидания / сна / гибернации осведомлен? - PullRequest
15 голосов
/ 28 декабря 2011

Подсчитывает ли System.Diagnostics.Stopwatch время в режиме ожидания компьютера?

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

Да, это так.

Просмотр кода в Reflector показывает, что если он не Stopwatch.IsHighResolution, он будет использовать счетчик тиков (в моем окружении это значение было false, поэтому он будет использовать DateTime.UtcNow.Ticks):

public void Start()
{
    if (!this.isRunning)
    {
        this.startTimeStamp = GetTimestamp();
        this.isRunning = true;
    }
}



public static long GetTimestamp()
{
    if (IsHighResolution)
    {
        long num = 0L;
        SafeNativeMethods.QueryPerformanceCounter(out num);
        return num;
    }
    return DateTime.UtcNow.Ticks;
}
3 голосов
/ 28 декабря 2011

На самом деле, после небольшого тестирования кажется, что считается, но это было далеко. Вот что я сделал:

  1. Написал следующий код
  2. Запустил его и сразу перевел мой компьютер в режим Спящий режим
  3. Подождал 10 секунд и снова включил мой компьютер

Результатом стало шокирующее Elapsed время более 4 минут. Далеко. Поэтому я бы не стал использовать это в качестве какого-либо эталона.

Вот код, который я использовал:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace TestingCode
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch testing = new Stopwatch();

            testing.Start();

            Console.WriteLine("Press any key to stop timer");
            Console.ReadKey();

            testing.Stop();

            Console.WriteLine("Elapsed: {0}", testing.Elapsed);

            Console.WriteLine("Done!!");
            Console.ReadKey();
        }
    }
}
...