2014-12-03 76 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)是更好的

相关问题