如何将定时器分辨率从C#设置为1 ms?

我使用过这个工具 ,发现我的Windows Server 2008 R2 Standard的分辨率为15毫秒,而Windows 8的分辨率为1毫秒。

我宁愿在Windows Server 2008 R2上将Timer Resolution设置为1 ms,因为我正在运行低延迟软件。

我发现了这篇msdn文章 ,但它没有解释如何从C#程序更改Timer分辨率。 我怎么做?

你可以试试这个:

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

并像这样使用它:

 WinApi.TimeBeginPeriod(1); 

并回到原来的样子:

 WinApi.TimeEndPeriod(1); 

更好的代码实现这个将是:

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

使用它:

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