Могу ли я улучшить разрешение Thread.Sleep?

Разрешение Thread.Sleep () варьируется от 1 до 15,6 мс

Учитывая это консольное приложение:

class Program
{
    static void Main()
    {
        int outer = 100;
        int inner = 100;
        Stopwatch sw = new Stopwatch();

        for (int j = 0; j < outer; j++)
        {
            int i;
            sw.Restart();
            for (i = 0; i < inner; i++)
                Thread.Sleep(1);
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);
        }
    }
}

Я ожидал, что результат будет 100 чисел, близких к 100. Вместо этого я получаю что-то вроде этого:

99 99 99 100 99 99 99 106 106 99 99 99 100 100 99 99 99 99 101 99 99 99 99 99 101 99 99 99 99 101 99 99 99 100 99 99 99 99 99 103 99 99 99 99 100 99 99 99 99 813 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1559 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1558 1559

Но иногда я не получаю никаких точных результатов; это будет ~ 1559 каждый раз.

Почему это не соответствует?

Некоторый поиск в Google научил меня, что 15,6 мс - это длина временного интервала, что объясняет результаты ~ 1559. Но почему иногда я получаю правильный результат, а иногда я просто получаю множитель 15,6? (например, Thread.Sleep (20) обычно дает ~ 31,2 мс)

Как на это влияет аппаратное или программное обеспечение?

Я спрашиваю об этом из-за того, что привело меня к открытию:

Я разрабатывал свое приложение на 32-битной двухъядерной машине. Сегодня моя машина была обновлена до 64-битного четырехъядерного с полной переустановкой ОС. (Windows 7 и .NET 4 в обоих случаях, однако я не могу быть уверен, что на старой машине был установлен W7 SP1; на новой есть.)

Запустив мое приложение на новой машине, я сразу же заметил, что исчезновение моих форм занимает больше времени. У меня есть собственный метод для затухания моих форм, который использует Thread.Sleep () со значениями, варьирующимися от 10 до 50. В старой системе это, казалось, работало идеально каждый раз. В новой системе затухание занимает гораздо больше времени, чем следовало бы.

Почему это поведение изменилось между моей старой системой и моей новой системой? Это связано с аппаратным или программным обеспечением?

Могу ли я сделать это неизменно точным? (Разрешение ~ 1 мс)

Есть ли что-то, что я могу сделать в своей программе, чтобы сделать Thread.Sleep () надежно точным с точностью до 1 мс? Или даже 10 мс?

Ответы на вопрос(5)

Ваш ответ на вопрос