2014-12-03 82 views
1

我開發了一個程序來讀取具有指定產品ID和供應商ID(pid和vid)的寫入HID設備。這是library如何通過C#中的程序釋放未使用的佔用內存

除了一個問題,它的工作完美。在計時器刻度事件中,我正在檢查設備是否連接。計時器滴答持續時間是1000毫秒。該代碼是下面:

if (_connectionTester.IsDeviceConnected()) 
{ 
    connectionStatusPictureBox.Image = Globals.Resources.GreenCircleImage; 
    HIDGlobals.Connected = true; 
} 
else 
{ 
    connectionStatusPictureBox.Image = Globals.Resources.RedCircleImage; 
    HIDGlobals.Connected = false; 
} 

IsDeviceConnected功能是:

public bool IsDeviceConnected() 
{ 
    return _usb.getDeviceList() 
     .Any(d => d.Contains(HIDGlobals.VID + "&" + HIDGlobals.PID)); 
} 

的問題是隨着時間的流逝這增加了存儲器的使用。當我第一次啓動軟件時,內存使用量爲33.6 MB(在任務管理器內存列中)。 10分鐘後,它變爲38.7 MB。 5-6小時後它變成GB。

這是一個將運行8-9小時的應用程序。有什麼方法可以釋放內存嗎?我曾嘗試垃圾收集器GC.Collect()

但它沒有幫助。任何人都可以在這方面幫助嗎?

在此先感謝。

+4

內存使用增長到GB的範圍似乎表明有泄漏的地方,所以這就是你需要確定和地址 – 2014-12-03 15:34:25

+0

通常GC利用未使用的內存非常好的東西。您提供的代碼不足以推斷內存泄漏的位置。你必須使用一些內存分析器來定位它。 – 2014-12-03 15:38:57

+0

它可能是需要處理的'GetDeviceList'的結果嗎? – ppetrov 2014-12-03 15:39:06

回答

0

每次調用Globals.Resources.GreenCircleImage都會創建新圖像。您必須處理您不再使用的每個圖像,否則將會發生內存泄漏。

兩種方法:

1)您可以在應用程序啓動時創建圖像實例。並在應用程序完成時銷燬它們。

2)您需要處理要替換的圖像。

方法1)是更好的

相關問題