2015-05-14 34 views
3

目前我有一個計時器,我假設每5ms調用TimerCallback字段中定義的方法,但在閱讀關於Timer類和它的分辨率後,我發現Timer類僅具有15ms的分辨率或更高。運行速度超過15ms的秒錶

例如

autoDispatchTimer = new Timer(new TimerCallback(this.SendData), null, 0, 5); 

我也看了成使用Stopwatch,因爲這確實允許更高的分辨率,但我仍然不確定如何使用Stopwatch來進行同樣的操作。無論如何,這可以使用Stopwatch對象來完成嗎?

這是一個閱讀ElapsedMilliseconds屬性並在那裏調用SendData方法的情況,還是我誤解了C#中Stopwatch的工作方式?

關於此查詢的幫助將不勝感激。

編輯:我完全理解計時器的準確度爲15ms,因此我的問題的其餘部分詢問更快的替代方案。標題現在已被修改以反映這一點。

+5

你不能有這一點,因爲系統Tyme的精度爲15ms – Kimi

+0

我會建議你看看線程 – TheLethalCoder

+0

從技術上講,你可以使用'NtSetTimerResolution'來加速Windows中的線程調度,但我會建議不要這樣做。仍然沒有保證。 – Chris

回答

1

問題是Timer在後臺掛起,並在某個時間點有時間做些事情。這是保證不會比你的計時器中指定的時間更快(所以它將需要至少指定的時間,它可能需要更多)。在它回來之前,我通常需要幾毫秒的時間。 timer accuracy is 15ms on Windows 7 and higher,所以沒有機會像這樣更快地獲得它。

唯一比Timer更快的是while循環。你可以使用它,或重新考慮你的設計(至少,這是我會做的)。

1

計時器的分辨率documentation說:

系統計時器分辨率決定 Windows如何頻繁地執行兩個 主要行動:

  • 更新計時器滴答 計數,如果全剔已過。
  • 檢查計劃的計時器對象 是否已過期。

計時器滴答聲是Windows用於跟蹤 一天的時間和線程量子時間流逝 時間概念。 默認情況下,時鐘中斷和 計時器的滴答是一樣的,但Windows 或應用程序可以更改中斷週期的時鐘 。

在Windows 7上的默認計時器 分辨率是15.6 毫秒(毫秒)。某些應用程序 將此降低到1毫秒,這使移動系統上的電池運行時間減少了 多達25%。

不過你可以試試這個:

[DllImport("ntdll.dll", EntryPoint = "NtSetTimerResolution")] 
public static extern void NtSetTimerResolution(uint DesiredResolution, bool SetResolution, ref uint CurrentResolution); 

private void Foo() 
{ 
    uint DesiredResolution = 9000; 
    bool SetResolution= true; 
    uint CurrentResolution = 0; 

    NtSetTimerResolution(DesiredResolution, SetResolution, ref CurrentResolution); 
} 

Source

您也可以參考:High-Performance Timer in C#

+1

更好地使用記錄的API,例如timeBeginPeriod。 – usr