C# C语言程序如何释放未使用的占用内存#

C# C语言程序如何释放未使用的占用内存#,c#,memory,garbage-collection,C#,Memory,Garbage Collection,我开发了一个程序来读写具有指定产品id和供应商id(pid和vid)的HID设备。这是: 除了一个问题,它工作得很好。在计时器滴答声事件中,我正在检查设备是否已连接。计时器滴答声持续时间为1000毫秒。代码如下: if (_connectionTester.IsDeviceConnected()) { connectionStatusPictureBox.Image = Globals.Resources.GreenCircleImage; HIDGlobals.Connecte

我开发了一个程序来读写具有指定产品id和供应商id(pid和vid)的HID设备。这是:

除了一个问题,它工作得很好。在计时器滴答声事件中,我正在检查设备是否已连接。计时器滴答声持续时间为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.7MB。5-6小时后,它变成GB

这是一个运行8-9小时的应用程序。有没有办法释放内存?我尝试了垃圾收集器
GC.Collect()

但这没用。在这方面有人能帮忙吗


提前感谢。

每次呼叫Globals.Resources.GreenCircleImage都会创建新的图像。您必须处理所有不再使用的图像,否则将导致内存泄漏

两种方法:

1) 您可以在应用程序启动时创建映像实例。并在应用程序完成时销毁它们

2) 您需要处理要替换的映像


方法1)更好

内存使用增长到GB范围似乎表明某个地方存在泄漏,因此这就是您需要识别的内容&通常GC使用的未使用内存非常好。您提供的代码不足以推断内存泄漏的位置。您必须使用一些内存探查器来定位它。是否需要将
GetDeviceList
的结果释放到@AlexK。这里没有特殊的魔法
CleanUpLeaks()
方法。你需要弄清楚分配的是什么。我会先抓取一个内存转储,用Windbg打开它,然后做一个
!Dumpheap-stat
。在黑暗中拍摄其他任何东西消除变量:问题
IsDeviceConnected
还是图片?我怀疑可能是图书馆泄露了内存。快速看一下&源代码似乎有点可疑。