释放WPF图像控件的缓存

时间:2011-09-17 10:48:58

标签: c# wpf imaging

我有一个计时器,每次打勾我想从内存中取一个图像文件,用这段代码更改Image中显示的图像

  Application.Current.Dispatcher.BeginInvoke(
            DispatcherPriority.Render,
            new Action(() =>
                           {
                               ms.Seek(0, SeekOrigin.Begin);
                               e.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);


                               BitmapImage bitmapImage = new BitmapImage();
                               bitmapImage.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
                               bitmapImage.BeginInit();
                               bitmapImage.StreamSource = ms;
                               bitmapImage.CacheOption = BitmapCacheOption.None;
                               bitmapImage.EndInit();

                               CameraImageBox.BeginInit();
                               CameraImageBox.Source = bitmapImage;
                               CameraImageBox.EndInit();
                               bitmapImage = null;
                               ms.Flush();
                           }));

图像控件在几十张图像后变成黑色,整个ui变得反应迟钝。内存使用量跃升到1gig,我假设图像控件渲染缓存没有被释放,因为e.Image是一个每次重绘的静态资源。

有没有更好的方法来执行此操作,例如在Rectangle中呈现图像或手动释放缓存?

1 个答案:

答案 0 :(得分:1)

我的理解是,您在每次迭代时多次将图像添加到MemoryStream

这是因为你的ms对象从外面存在而且永远不会丢弃。如果我理解正确的事情:

// go to begin of stream
ms.Seek(0, SeekOrigin.Begin);

// write your bitmap content into the stream 
e.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);

...
...
...
// flush to write content to the stream
ms.Flush();

现在理论上我理解你一直在覆盖相同的字节,但是为什么不在你的方法中使用using块来处理MemoryStream并测试结果而不是让它作为全局打开变量?