2010-08-19 23 views
2

我希望有人能夠對我可能發生的事情有所瞭解。以下是發生了什麼的總結。計時器延遲是隨着時間的推移而降低還是變得不一致?

我有一個應用程序,做很多「東西」。它是一個非常龐大的應用程序,使用許多線程進行大量的數字運算。有幾個定時器被使用。在很長一段時間內,定時器會一直停止調用已過時的處理程序。

例如:我有一個計時器設置爲每秒過去。幾個小時後,計時器開始隨機觸發很晚。如果我不重新啓動應用程序,性能會降低,定時器會稍後啓動,最終會變成3或4秒鐘,迫使我重新啓動應用程序。我一直無法識別任何泄漏。 CPU使用率沒有增加,內存不上,服務器沒有接近最大的地方。任何人都可以給我一些想法,可能是什麼原因造成的?

private void Timer_Elapsed(object source, ElapsedEventArgs e) 
{ 
    if (seconds > 0) 
    { 
     seconds--; 

     timer.Start(); 
    } 
} 
+0

內存使用情況根本沒有提高?我對這種問題的第一個嫌疑人是垃圾回收...... – 2010-08-19 23:01:42

+0

不要太迂腐,但是沒有像「C#Timer」那樣的東西。這是一個.NET定時器,並且你正在用C#編寫。 – 2010-08-19 23:02:02

+2

聽起來就像你的系統運行得越來越快,所以時間本身實際上正在減慢。嘗試解開永動機。 – womp 2010-08-19 23:02:25

回答

0

聽起來就像也許它不是真的一樣的計時器,所以這裏「泄漏」的資源是GDI句柄。

+0

...也可以通過任務管理器輕鬆檢查。 – 2010-08-19 23:04:13

5

是否有可能導致線程池耗盡?大多數計時器使用線程池線程調用處理程序。如果所有的線程池線程都在使用中,它只會排隊等待一個線程可用。

如果是這種情況,請將您的一些處理切換爲使用您自己的線程,而不是線程池線程。

爲了測試您是否正在耗盡線程池,啓動一個後臺線程,定期(每秒幾次)檢查ThreadPool.GetAvailableThreads,並在可用時很小時記錄一條消息(即使檢查時它實際上從未爲零,如果它有時接近零,那很可能是這個問題)。

池的大小可以用ThreadPool.SetMaxThreads更改,儘管這可能不是最好的解決方案。如果您使用線程池線程來執行更長時間的運行任務,請停止它。對於長時間運行的任務,請使用自己的線程。

+0

有沒有辦法增加線程池? – Nathan 2010-08-19 23:13:00

+0

這是一個問題嗎?爲什麼不發表問題作爲問題而不是評論:) – Timwi 2010-08-20 00:06:57

+0

@Nathan,Timwi是對的,如果你有另一個問題,最好的辦法是研究它或要求一個單獨的問題。使他們在得到正確答案時更容易,並且在他們有相同問題時讓其他人找到答案。 – 2010-08-20 01:04:35

0

可能的解決方法:

DateTime mayContinue = DateTime.MinValue; 
bool blockingUi = false; 

private void Timer_Elapsed(object source, ElapsedEventArgs e) 
{ 
    if(blockingUi) 
    { 
     if(DateTime.Now < mayContinue) 
     { 
      // Notify time remaining 
      // Update the UI with a BeginInvoke 
     } 
     else 
     { 
      blockingUi = false; 
      // Notify ready 
      // Update the UI with a BeginInvoke     
     } 
    } 
} 

private void BlockUi() 
{ 
    mayContinue = DateTime.Now.AddSeconds(30); 
    blockingUi = true; 
} 
1

您使用Timer類是非常重要的

http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

,但我不認爲這個問題是例如嘗試進行的計時本身, 應用程序使用相同的計時器類

即只寫入當前日期時間到日誌文件樂

,並讓它運行極長的一段時間內,你會看到,有沒有這樣的3/4秒延時

審覈您的計時器代碼並確認是否有共享資源在被訪問同時, 也許定時器是好的,但是在事件處理函數或函數使用的「某些東西」中存在瓶頸

相關問題