簡體   English   中英

長時間不活動后,.NET應用程序非常慢

[英].NET Application very slow after long period of inactivity

我不確定問題標題是否是最好的,但它是我能想到的最好的...

我有這個.NET(C#)應用程序,它啟動Windows並保持打開,直到計算機關閉。 應用程序停留在托盤上,然后單擊托盤圖標將其打開並以相同方式關閉它。

該應用程序一開始並不慢,它正常工作,沒有問題。 但是經過長時間的不活動,在很長一段時間內第一次再次顯示它時會變得很慢。 明白我的意思了嗎。

例如,我無法使用/打開(點擊托盤圖標)幾天,在那些日子里我打開和關閉並使用了很多其他應用程序,也是重型應用程序,我可能已經休眠並重新啟動計算機幾次,當我需要再次打開我的應用程序,這很慢。 使用幾分鍾后,它恢復正常並正常工作。

我相信這與內存管理有關,系統可能會釋放我應用程序的大部分內存,因此其他程序可以更有效地使用它。 也許.NET內存管理與它有關...

無論是什么原因,我可以做些什么來優化我的應用程序的問題?

這幾乎可以肯定是由於內存被分頁到磁盤。

當您停止使用您的應用程序和其他應用程序或任務開始施加內存壓力時,應用程序中的內存頁面可以寫入磁盤。 當您再次嘗試使用您的應用程序時,必須讀入所有這些數據,從而導致您看到的停頓。

不幸的是,沒有好的解決方案 - 如果您以管理員身份運行或擁有SeLockMemoryPrivilege,您可以將應用程序的某些部分鎖定到物理內存中。 您可以定期嘗試“觸摸”頁面以將它們保存在物理內存中。 不幸的是,這兩個選項都會導致您的應用程序與系統上的其他應用程序進行嚴重交互 - 您的內存將被分頁,因為其他內容需要物理內存。 您可以嘗試降低總體內存占用量,但在某些情況下仍會遇到此問題。 有一些選項可以調整你的工作集大小,但操作系統可以自由地忽略這些,並且在很多情況下也是如此。

您可以使用.NET內存分析器來了解應用程序隨着時間的推移對內存執行的操作。 您可以檢查是否有任何內容正在建立在您不期望的位置(集合,列表等)並導致您的內存占用增長。

您是否嘗試在正在運行的應用程序上雙擊Process Explorer並觀察它是否泄漏? 是CPU利用率,UI泄漏,內存泄漏,重復I / O?

如果問題確實是由於長時間不活動而導致程序被分頁,您是否嘗試設置“保持活動”計時器,每隔幾分鍾觸發一次,這基本上使應用程序處於尋呼系統的狀態有沒有看到它閑置?

我認為這種行為在Windows中是正常的。 Windows將提供最需要的應用程序,即當前使用的應用程序。 因此,如果應用程序被最小化或長時間不活動(如上面指定的情況),它將是Windows 尋呼應用程序內存並為活動應用程序提供可用內存的最佳候選者。 Windows將從分頁內存(硬盤)激活后恢復應用程序內存,這就解釋了為什么它很慢。

這可能不是最好的答案,但如果我是你,我將通過增加應用程序的基本優先級來進行實驗。 這可以通過在.NET框架中使用Thread對象來完成。

謝謝。

這不是根本原因的答案或解決方案,但如果邁克爾是正確的並且您無法真正做到這一點,那么您可能只是想通過進度條或漂亮的進度圈在視覺上通知用戶您的應用程序處於活動狀態。

它不會加速你的程序,但它可以讓你的用戶的思想稍微放松一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM