2012-12-20 41 views
4
  1. 是否有一種方法可以在C#中以高分辨率頻率執行方法,例如,每100微秒?每0.1毫秒和0.3毫秒重複兩個任務(Systems.Timer.Timer不夠精確)

  2. 關於不同頻率的兩種不同方法,例如, Method1每0.1 ms和Method2 0.3 ms?

MSDN有一個事件處理程序連接到Systems.Timers.Timer類這樣的文件:

public static void Main() 
{ 

    System.Timers.Timer aTimer = new System.Timers.Timer(); 
    aTimer.Elapsed += new ElapsedEventHandler(Method); 
    aTimer.Interval = 2000; 
    aTimer.Enabled = true; 
    GC.KeepAlive(aTimer); 
} 

System.Timers.Timer只有當我爲基準它有15〜16 ms的精度。我的CPU性能計數器的精度爲0.1毫秒以下,但我找不到將事件處理程序附加到Stopwatch類的方法。

另外,是否有一些線程問題,我需要知道當我在不同的頻率執行兩種方法?

謝謝!

+3

如果您需要這種精度,您應該查看帶有實時操作系統的系統。 http://en.wikipedia.org/wiki/Real-time_operating_system – tvanfosson

+0

我同意@tvanfosson,像這樣的時間段,你很可能會受到多任務影響 –

+0

@tvanfosson:感謝您的建議。出於開發時間的原因,我必須在.NET中工作。我讀過RTOS'es,但我希望在C#中有一個臨時解決方法。我發現不在我的控制範圍內的唯一部分是GC每隔幾分鐘就凍結我的應用程序<10 ms,這仍然是可以忍受的。 – elleciel

回答

3

這是醜陋的,但你可能有一些機會使用秒錶ElapsedTicks。

Stopwatch w = new Stopwatch() 
long nextTick = 0; 
long ticksPerMicroSecond = 1000000L/Stopwatch.Frequency; // Number of ticks per microsec. 
long periodInTicks = ticksPerMicroSecond/100; // Ticks per 0.1ms 

while(true) 
{ 
    long currentTick = w.ElapsedTicks. 
    if (currentTick > nextTick) 
    { 
    nextTick = currentTick + periodInTicks; 
    // Do something here. 
    } 
} 

這是醜陋的,因爲它可以得到的,你會得到一段時間(true)循環,這很可能會使用100%的CPU免費(最好在一個多核心運行它,然後)。

您可能希望稍微對基準進行基準測試(查看Stopwatch.Frequency msdn doc中的示例),查看您的計時器的精確程度,並查看您從內在功能遲到時獲得的偏差。您可能還想啓用背景gc以避免GC阻塞您的線程。雖然這表明它在代碼中是死的,但我確實不確定你的函數能在0.1ms內運行。

+0

+1。認真。這很糟糕,但最後如果你需要這麼低,那麼一個旋轉 - 這是你在這裏做的 - 是你所能做的一切。 – TomTom

2

這是不可能的。 Windows不是實時操作系統。

+0

-1。看,這是不可能的,因爲你不會找到這個分辨率的硬件,它低於windows提供的,但是對於硬件提供的moder nhardware winows能夠提供1毫秒分辨率的回調。 TimerQueue有很好的保證。但是0.1和0.3超出了所認爲的理由 - 他們有多媒體頭腦,而不是像......不知道會有多少0.1ms。 – TomTom

+1

@TomTom,一致的0.1/0.3ms間隔是不可能的,因爲Windows沒有關於線程是否將被安排在任何特定時間執行的保證。除此之外,CLR擁有GC可能會凍結所有線程,從而導致不確定的時間浪費。所以如果真的需要一致的時間間隔,那麼Windows中沒有太多可以完成的任務。 –

+1

@AlexeiLevenkov其實MS確保高精度計時器回調。問題是API有1ms的分辨率。但假設機器沒有過載並且硬件的HPET分辨率爲1ms,則可以獲得可靠的1ms回調。這主要用於音頻/視頻播放,以及不太知名的API。但是,它只能以1MS解決。而CLR GC將您的應用程序凍結爲今日是一個無知的人的初學者問題 - 一個不能允許的人只是放入非凍結的gc,你知道的。通過配置。因爲.NET 4.5實際上並不那麼難。 – TomTom

-2

不可能。你低於MS開發者認爲合理的。

最好的喲ucan做 - 欺騙現代硬件 - 是TImerQueue,HPET。可以在BIOS中禁用,因此可能需要調整。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686796(v=vs.85).aspx

沒有.NET API可用的,但是這是微不足道的通過互操作映射。

這樣說:那裏的定時參數有一個整數週期,並以毫秒爲單位給出,所以我們只討論1ms的分辨率。而且硬件是否大部分取決於年齡。

所以,對不起,這是關於你能得到的最好的。