AForge,内存堆叠

AForge, memory stacking up

我正在尝试使用 C# 和 AForge 库获取框架:

...
using AForge.Video
using AForge.Video.DirectShow

namespace Example
{
     class Program
     {

      private static Bitmap mySnap = null;

      static void Main(string[] args)
      {
             snapByte();
      }

      private static void snapByte()
      {
                    int Counter = 0;
                    FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
                    VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
                    videoSource.NewFrame += new NewFrameEventHandler(videoNewFrame);
                    videoSource.Start();
                    do
                    {
                        Thread.Sleep(500);
                        Counter++;
                    }
                    while (mySnap == null && Counter < 4);
                    if (videoSource.IsRunning)
                    {
                        videoSource.SignalToStop();
                        videoSource.WaitForStop();
                        videoSource = null;
                    }
                    MemoryStream myStream = new MemoryStream();
                    mySnap.Save(myStream, ImageFormat.Png);
                    byte[] snapByteLength = MyStream.ToArray();
                    int snapLength = snapByteLength.Length;
                    Console.WriteLine(snapLength);
                    Console.ReadLine();
                    myStream.Dispose();
                    mySnap = null;
                    snapByte();
            }
        }

        private static void videoNewFrame(object sender, NewFrameEventArgs eventArgs)
        {
             mySnap = (Bitmap)eventArgs.Frame.Clone();
        }
   }
}

这正是我使用的代码,我只是更改了图像字节处理以显示字节长度以简化操作..

我遇到的问题是,每次拍摄快照时,内存都会保持在 1-2 mb 之间的任何位置。 我正在处理我的所有位图,除了我返回 null 的 mySnap。我不能处理 mySnap,因为它再次使用,我必须声明它是全局的,因为我在 snapByte() 和 newVideoFrame() 中使用它 但是因为我重用了 mySnap 我不明白为什么它会堆积起来..它应该每次都被覆盖..

我看过其他答案,但都与图片框有关,答案是在加载新图像之前清除图片框.. 我相信我在这里通过再次调用 mySnap=null 来做同样的事情.. 但内存仍在堆积...

谢谢..

您正在通过在 snapByte() 方法末尾无条件调用 snapByte() 创建无限递归。 这会创建一个循环,一旦您的堆栈用完 space,该循环最终会崩溃;每次您的方法调用自身时,您都在设置一个永远不会被清除的新堆栈帧,因为该方法永远不会 returns。这可能需要一段时间才能体现出来,因为 Thread.Sleep() 调用会使您的递归调用受到限制。

此外,任何在递归调用 snapByte() 之前未被清空的引用都将无限期地保留在内存中,因为这些引用在永远不会退出的范围内存在(因为无限递归) 并且永远不会被 GC 回收。

您的 videoDevices 集合就是这种情况,但更重要的是 snapByteLength 数组实例,它包含您刚刚捕获的位图的副本。我敢打赌这是你内存泄漏的主要原因

避免递归并将其转换为简单循环应该可以解决您的问题。