cómo establecer la resolución del temporizador de C # a 1 ms?

Utilicé esta herramienta y noté que mi Windows Server 2008 R2 Standard tiene una resolución de 15 ms, mientras que Windows 8 tiene un temporizador de resolución de 1 ms.

Preferiría configurar la resolución del temporizador en 1 ms en Windows Server 2008 R2 porque estoy ejecutando un software de baja latencia en él.

Encontré este artículo msdn , pero no explica cómo cambiar la resolución del temporizador de un progtwig C #. ¿Cómo puedo hacer eso?

Puedes intentar esto:

 public static class WinApi { /// TimeBeginPeriod(). See the Windows API documentation for details. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1401:PInvokesShouldNotBeVisible"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage"), SuppressUnmanagedCodeSecurity] [DllImport("winmm.dll", EntryPoint="timeBeginPeriod", SetLastError=true)] public static extern uint TimeBeginPeriod(uint uMilliseconds); /// TimeEndPeriod(). See the Windows API documentation for details. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1401:PInvokesShouldNotBeVisible"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage"), SuppressUnmanagedCodeSecurity] [DllImport("winmm.dll", EntryPoint="timeEndPeriod", SetLastError=true)] public static extern uint TimeEndPeriod(uint uMilliseconds); } 

Y úsalo así:

 WinApi.TimeBeginPeriod(1); 

Y para volver a cómo era:

 WinApi.TimeEndPeriod(1); 

Un mejor código para implementar esto sería:

 using System; using System.Runtime.InteropServices; using System.Threading; internal sealed class TimePeriod : IDisposable { private const string WINMM = "winmm.dll"; private static TIMECAPS timeCapabilities; private static int inTimePeriod; private readonly int period; private int disposed; [DllImport(WINMM, ExactSpelling = true)] private static extern int timeGetDevCaps(ref TIMECAPS ptc, int cbtc); [DllImport(WINMM, ExactSpelling = true)] private static extern int timeBeginPeriod(int uPeriod); [DllImport(WINMM, ExactSpelling = true)] private static extern int timeEndPeriod(int uPeriod); static TimePeriod() { int result = timeGetDevCaps(ref timeCapabilities, Marshal.SizeOf(typeof(TIMECAPS))); if (result != 0) { throw new InvalidOperationException("The request to get time capabilities was not completed because an unexpected error with code " + result + " occured."); } } internal TimePeriod(int period) { if (Interlocked.Increment(ref inTimePeriod) != 1) { Interlocked.Decrement(ref inTimePeriod); throw new NotSupportedException("The process is already within a time period. Nested time periods are not supported."); } if (period < timeCapabilities.wPeriodMin || period > timeCapabilities.wPeriodMax) { throw new ArgumentOutOfRangeException("period", "The request to begin a time period was not completed because the resolution specified is out of range."); } int result = timeBeginPeriod(period); if (result != 0) { throw new InvalidOperationException("The request to begin a time period was not completed because an unexpected error with code " + result + " occured."); } this.period = period; } internal static int MinimumPeriod { get { return timeCapabilities.wPeriodMin; } } internal static int MaximumPeriod { get { return timeCapabilities.wPeriodMax; } } internal int Period { get { if (this.disposed > 0) { throw new ObjectDisposedException("The time period instance has been disposed."); } return this.period; } } public void Dispose() { if (Interlocked.Increment(ref this.disposed) == 1) { timeEndPeriod(this.period); Interlocked.Decrement(ref inTimePeriod); } else { Interlocked.Decrement(ref this.disposed); } } [StructLayout(LayoutKind.Sequential)] private struct TIMECAPS { internal int wPeriodMin; internal int wPeriodMax; } } 

Úselo a través de:

 using (new TimePeriod(1)) { ////... }