Posso melhorar a resolução do Thread.Sleep?

A resolução Thread.Sleep () varia de 1 a 15.6ms

Dado este aplicativo de console:

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);
        }
    }
}

Eu esperava que a saída fosse de 100 números próximos a 100. Em vez disso, recebo algo assim:

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 99 99 99 99 99 99 101 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 100 813 1559 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 1558 1558 1558 1558 1558

Mas, às vezes, não recebo resultados precisos; será ~ 1559 todas as vezes.

Por que não é consistente?

Alguns pesquisadores me ensinaram que 15,6ms é o tamanho de uma fatia de tempo, o que explica os resultados de ~ 1559. Mas por que às vezes eu obtenho o resultado certo e outras vezes apenas 15,6? (por exemplo, Thread.Sleep (20) geralmente fornece ~ 31,2ms)

Como é afetado por hardware ou software?

Peço isso por causa do que me levou a descobri-lo:

Eu estava desenvolvendo meu aplicativo em uma máquina dual-core de 32 bits. Hoje, minha máquina foi atualizada para 64 bits quad-core com uma reinstalação completa do sistema operacional. (Windows 7 e .NET 4 em ambos os casos, no entanto, não posso ter certeza de que a máquina mais antiga tinha o W7 SP1; a nova possui.)

Ao executar meu aplicativo na nova máquina, noto imediatamente que meus formulários levam mais tempo para desaparecer. Eu tenho um método personalizado para desvanecer meus formulários que usa Thread.Sleep () com valores variando de 10 a 50. No sistema antigo, isso parecia funcionar perfeitamente sempre. No novo sistema, está demorando muito mais para desaparecer do que deveri

Por que esse comportamento mudou entre o meu sistema antigo e o meu novo sistema? Isso está relacionado a hardware ou software?

Posso torná-lo sempre preciso? (~ 1 ms de resolução)

Existe algo que eu possa fazer no meu programa para tornar o Thread.Sleep () confiável com precisão de cerca de 1 ms? Ou até 10ms?

questionAnswers(5)

yourAnswerToTheQuestion