如何在wpf中正确处理资源

时间:2013-06-05 08:05:21

标签: c# wpf

嗨我有一个应用程序,只要按下按钮,我就必须从三个不同的IP摄像机保存图像。

我正在使用一个类,其中包含我需要的所有成员来保存来自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 个答案:

答案 0 :(得分:1)

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

以这种方式定义的资源在执行using语句中的语句后自动处理。