2011-05-10 109 views
2

我對線程沒有太多的經驗。我正在使用.NET 4,並希望使用.NET 4線程功能來解決這個問題。這是我想要做的。通過一定間隔的時間間隔通過線程執行任務

我有兩種方法'A'和'B'。我希望'A'每幾毫秒(如3000)每次調用'B'幾次(如100)。我想記錄方法'B'在完成100次(或其他)時的平均執行時間。爲了計算平均值,該類將有一些私有屬性來跟蹤'B'的總執行時間。

我不知道方法'A'是否應該通過System.Timers.Timer線程(其中間隔可以設置,但不是次數)調用'B',或者如果有更好的(。 NET 4)這樣做的方式。

非常感謝。

+0

這不像一個評論的答案,但這是一個關於多線程和在.NET 4中使用定時器的非常好的文章:http://www.albahari.com/threading/part3。 aspx – IAmTimCorey 2011-05-10 15:37:24

+1

偉大的文章 - 我以前引用過它。 – 2011-05-10 15:58:13

回答

3

在閱讀您的問題時,我認爲您的根本問題是安全地啓動一組事件並以線程安全的方式計時它們的執行。在你的例子中,你每3000毫秒運行100次迭代。這意味着至多每次迭代只需要30ms。不幸的是,System.Timers.Timer(System.Threading.Timer與它的包裝器)並不那麼精確。最好預計精度爲10ms,可能會更糟。爲了獲得真正需要的1ms精度,您將需要使用本機互操作。以下是我在此發現的報價:

多線程定時器的精度取決於操作系統,通常位於10-20 ms區域中。如果您需要更高的精度,則可以使用本機互操作並調用Windows多媒體計時器。這精度低至1毫秒,它在winmm.dll中定義。首先調用timeBeginPeriod來通知操作系統您需要較高的定時精度,然後調用timeSetEvent啓動多媒體定時器。完成後,調用timeKillEvent來停止定時器和timeEndPeriod,以通知操作系統您不再需要高定時精度。您可以通過搜索關鍵字使用的多媒體計時器在互聯網上完整的例子dllimport的WINMM.DLL的timeSetEvent

-Joseph阿爾巴哈利(http://www.albahari.com/threading/part3.aspx

如果你聽從他的建議,你應該得到的精度你需要。

+0

這可能是矯枉過正 - 我沒有看到來自OP的關於極端準確性的非常具體的聲明 - 爲什麼不使用Timer類來處理間隔並計算靜態變量中出現次數和流逝次數,一旦出現計數達到所需的N?我的印象是,OP正在尋找確認這是最好的.Net類在這裏使用,它是。 – 2011-05-10 17:33:22