2012-05-28 38 views
7

我目前在10秒間隔內使用System.Threading.Timer。每次定時器觸發時,我都會添加一小段代碼以寫入文件,而且大多數時候它會按時啓動,有時(大概在應用程序的其餘部分購買時),無法觸發30或40秒,然後連續發射一遍又一遍。計時器比System.Threading.Timer更可靠

是否有更可靠的計時器,我可以在.NET 3.5中使用?

定時器的設置如下

Timer someTimer = new Timer(new TimerCallback(SomeMethod), null, 0, 10000); 

...和回調:

private static void SomeMethod(object state) 

然而,這是難以提供更多的代碼比這個,作爲定時通常正確觸發。當它被嵌入到大量的應用程序中時(大約100,000行左右),多個線程被釋放,左,右和中間,你慢慢開始看到定時器間歇性地發射。 我見過幾篇帖子,提示ThreadPool可能已經用盡,所以我現在正在查看是否可能是我正在經歷的。

+5

可以提供一些示例代碼而不是*假設*定時器不可靠嗎?我傾向於發現它是我自己的代碼,這是問題,而不是.NET框架。 –

+0

定時器的設置如下: – JamesPD

+0

如果處理tick時間超過10秒,則ThreadPool飢餓將很可能是這種情況。你會慢慢積壓物品。標準策略是在進入tick事件時停止定時器,並在最後再次啓動,以避免由於處理時間過長而導致「定時器泄漏」。 –

回答

3

這聽起來完全像線程池飢餓。注意在線程池中運行的長時間運行/阻塞作業,並使用async io重寫,或者在長時間運行CPU密集型作業的情況下,不要在線程池中運行這些作業。在他們自己的線程上運行它們或使用後臺工作者。

+0

我希望它可能只是一個特定於System.Threading.Timer的問題,並且通過切換到另一個Timer,我可以解決這個問題。在提示和仔細檢查之後,它確實看起來像一個ThreadPool飢餓問題。感謝所有人的幫助。 – JamesPD

8

參考不同的定時器類在.NET

Different Timer class in .net

有三個在.NET中稱爲 '定時器' 定時器類。這聽起來像你使用的Windows窗體之一,但實際上你可能會發現System.Threading.Timer類更有用 - 但要小心,因爲它回調池線程,所以你不能直接與你的表單交互回調。

更精確的定時器 - 作爲每MSDN

Windows窗體Timer組件是單線程的,並且被限制到55毫秒的精度。如果您需要更高精度的多線程計時器,請使用System.Timers名稱空間中的Timer類。

+0

聽起來像他正在使用它,但他實際上聲明他正在使用'System.Threading.Timer',根據節拍器質量是選擇兩個最「可靠」之一。 –

+0

嗨Romil,謝謝你,正如其他人指出的,它似乎是一個ThreadPool飢餓問題,但謝謝你的表。我相信它遲早會派上用場。 – JamesPD