Разрешение 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
1560
1559
1559
1559
1559
1558
1558
1558
1558
1558
1558
1558
1558
1558
1558
1558
1558
1558
1558
1558
1558
1558
1558
1558
1559
1558
1558
1558
1558
1558
Но иногда я не получаю никаких точных результатов; это будет ~ 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 мс?