【问题标题】:Memory leak in C# winforms app on picturebox图片框上的 C# winforms 应用程序中的内存泄漏
【发布时间】:2015-02-15 21:27:43
【问题描述】:

我的应用程序从视频中读取帧(进行一些处理),然后将其显示在图片框中 - 这大约每秒完成 10 次,我现在遇到了图片框图像未正确处理的问题.

我遇到内存泄漏并最终出现内存不足异常。

   //Check if PictureBox already contains an image, if so dispose of it.
if (VideoDisplay.Image != null)
{
    VideoDisplay.Image.Dispose();
}
   //set parameter to the new image
displayImage = OverlayImage.UpdateImage(eventArgs.Frame, WarningText, WarningBrush);
   //set the picturebox to the new image
VideoDisplay.Image = displayImage;
   //dispose of brush & start garbage collector
WarningBrush.Dispose();
GC.Collect();

通过注释掉VideoDisplay.Image = displayImage 行,内存泄漏停止(但显然我没有得到图像)。

只是想知道是否有人可以帮我解决这个问题,因为我以前从未处理过物品等,不知道我是否在处理时犯了错误或遗漏了什么。

【问题讨论】:

  • 这里发生了什么OverlayImage.UpdateImage
  • 1.你为什么把刷子丢在这里?明明这段代码没有分配刷子,那代码在哪里呢? 2.OverlayImage.UpdateImage(...)是做什么的?你能显示该方法的代码吗? 3. 您应该在处理它之前将图片框的图像拉出图片框,方法是将其抓取到局部变量中并将图片框的 Image 属性设置为 null。 4.您确定重新分配图片框的Image属性不会自行处理现有图像(我不知道,需要检查)吗?
  • @LasseV.Karlsen 对于第 4 点,它没有。
  • 我在这里处理刷子,因为这是最后一次使用它,因为我认为这是正确的做法,如果不是请纠正我。 OverlayImage.UpdateImage() 基本上将叠加层添加到当前帧并传回图像,我可以稍后获取代码(因为我不在我的电脑上),但我尝试设置 displayImage = eventArgs.Frame 仍然会导致内存泄漏。我将尝试您稍后提出的第 3 点,并让您知道我的结果。感谢您的反馈。

标签: c# image winforms memory-leaks idisposable


【解决方案1】:

在更新图像之前,您需要对其进行处置。我有类似的问题。
像这样:

VideoDisplay.Image.Dispose();

在该行代码之后,更新图像。 对于您的方案:

VideoDisplay.Image = displayImage;

【讨论】:

    【解决方案2】:

    通过删除它修复它的 VideoDisplay.Dispose() 找到了答案。 通过快速查找,可能已经在对象上设置了锁,GC 无法收集该锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2012-09-16
      • 1970-01-01
      • 2014-05-01
      • 2011-08-20
      • 2012-06-14
      相关资源
      最近更新 更多