2013-06-05 176 views
0

嗨,我有一个应用程序,我必须保存图像从三个不同的IP摄像机,只要按下按钮。如何正确处理资源wpf

我正在使用一个类,它具有我需要从IP相机保存图像的所有成员,即BitmapImage和照片保存时的DateTime。

我有以下问题。我需要每隔几百毫秒为每台摄像机保存一定数量的照片。我目前正在测试它,每200毫秒将每个摄像头的50张照片保存到一个ConcurrentQueue中,然后将这些项目从ConcurrentQueue保存到文件中。在三台相机中共拍摄了110张照片后,它只保存空白图像。

我认为我的问题是程序内存太满了,所以当我用ConcurrentQueue的TryDequeue()方法保存项目时,我需要清除内存中的项目。

任何人都可以请建议我或给我也许一些链接,可以帮助我保存这个问题,这样我可以保存尽可能多的照片,我想每个相机,并且它不会用完内存后照片数量?

按下一个按钮,然后它进入一个for循环,它将调用以下方法。

private void EnqueuePhotos1() 
    { 
     IPCamera1 ipCam1Enqueue = new IPCamera1(); 
     BitmapImage cam1Image = new BitmapImage(); 
     cam1Image.BeginInit(); 
     cam1Image.CacheOption = BitmapCacheOption.OnLoad; 
     cam1Image.CreateOptions = BitmapCreateOptions.IgnoreImageCache; 
     cam1Image.UriSource = null; 
     cam1Image.UriSource = new Uri("http://" + ipCam1IP + "/image?res=full&x0=0&y0=0&x1=1600&y1=1200&quality=21&doublescan=0", UriKind.Absolute); 
     while (cam1Image.IsDownloading) { ; } 
     cam1Image.EndInit(); 
     ipCam1Enqueue.IPCamImage = cam1Image; 
     ipCam1Enqueue.TimeTook = DateTime.Now; 
     ipCam1ConQ.Enqueue(ipCam1Enqueue); 
    } 

一定的时间取决于用户想要拍摄多少张照片。

就在for循环之前,我启动计时器来检查每100ms是否存在ConcurrentQueue上的某些内容,然后如果发现某些内容,它会调用以下函数。在这样的方式定义

private void GetPhotos1() 
    { 
     IPCamera1 ipCam1Dequeue = new IPCamera1(); 
     while (ipCam1ConQ.TryDequeue(out ipCam1Dequeue)) 
     { 
      cam1Photos++; 
      cam1ImgLoc = cam1Location + "\\Image " + cam1Photos + ".jpg"; 
      FileStream cam1Stream = new FileStream(cam1ImgLoc, FileMode.Create); 
      JpegBitmapEncoder cam1Encoder = new JpegBitmapEncoder(); 
      cam1Encoder.Frames.Add(BitmapFrame.Create(ipCam1Dequeue.IPCamImage)); 
      cam1Encoder.Save(cam1Stream); 
      cam1Stream.Dispose(); 
     } 
    } 
+1

“我认为我的问题是程序内存太满了”=>为什么? – Jon

+0

您也可以检查您是否没有大对象堆碎片问题,如果将照片保存在内存上,可能会出现这种情况。 https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/ – polkduran

+1

如果有人能够在不知道您的应用程序如何工作的情况下回答您的问题(生命周期管理)?一般来说,您可以剖析应用程序以了解潜在内存泄漏的想法,尽管我不确定是否有潜在的内存泄漏。 [.NET Memory Profiler](http://memprofiler.com/)是恕我直言,适合这份工作。 – DHN

回答

1
using (FileStream cam1Stream = new FileStream(cam1ImgLoc, FileMode.Create)) 
{ 
    // do stuff... 
} 

资源会被自动设置执行在using语句的语句之后。