¿Puedo mejorar la resolución de Thread.Sleep?

Thread.Sleep () la resolución varía de 1 a 15,6 ms

Dada esta aplicación de consola:

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

Esperaba que la salida fuera de 100 números cercanos a 100. En cambio, obtengo algo como esto:

99 99 99100 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 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 1558 1558 1559 1558 1558 1558

Pero a veces no obtendré resultados precisos; será ~ 1559 cada vez.

¿Por qué no es consistente?

Algunos google me enseñaron que 15,6 ms es la longitud de un segmento de tiempo, por lo que eso explica los resultados ~ 1559. Pero, ¿por qué a veces obtengo el resultado correcto y otras veces solo obtengo un múltiplo de 15.6? (por ejemplo, Thread.Sleep (20) generalmente dará ~ 31.2ms)

¿Cómo se ve afectado por el hardware o el software?

Pregunto esto por lo que me llevó a descubrirlo:

He estado desarrollando mi aplicación en una máquina de doble núcleo de 32 bits. Hoy mi máquina se actualizó a 64 bits de cuatro núcleos con una reinstalación completa del sistema operativo. (Windows 7 y .NET 4 en ambos casos, sin embargo, no puedo estar seguro de que la máquina anterior tuviera W7 SP1; la nueva sí.)

Al ejecutar mi aplicación en la nueva máquina, inmediatamente noto que mis formularios tardan más en desaparecer. Tengo un método personalizado para desvanecer mis formularios que usa Thread.Sleep () con valores que varían de 10 a 50. En el sistema anterior, esto parecía funcionar perfectamente todo el tiempo. En el nuevo sistema, tarda mucho más en desvanecerse de lo que debería.

¿Por qué cambió este comportamiento entre mi antiguo sistema y mi nuevo sistema? ¿Está esto relacionado con el hardware o el software?

¿Puedo hacerlo consistentemente preciso? (~ Resolución de 1 ms)

¿Hay algo que pueda hacer en mi programa para que Thread.Sleep () tenga una precisión confiable de aproximadamente 1 ms? ¿O incluso 10 ms?

Respuestas a la pregunta(5)

Su respuesta a la pregunta