【发布时间】:2011-04-03 15:53:01
【问题描述】:
我有一个简单的 WPF 窗口,它下面有一个 Image 控件和一个 Slider 控件。当用户移动滑块时,我正在加载各种图像并将其设置为图像控件的源。我得到了很多图像,大小不等,最大为 200 KB,但是当我将滑块向后和第四次移动时,程序开始占用大量内存。数百和数百兆的内存。其中大部分最终都会被垃圾收集,但不是全部。
也许 WPF 不是要走的路,还是我应该强制使用 G/C?我尝试将图像加载为位图并使用Imaging.CreateBitmapSourceFromHBitmap() 和 Win32-api 获取位图源以删除和处置等等,但我只是让事情变得更糟:)
我想我应该在加载和分配新的图像源之前尝试获取现有图像源并以某种方式释放它。
有什么想法吗?
编辑
我正在添加一些运行良好的示例代码,并且似乎可以保持内存低而正常:
private Image _lastImage;
// Event when user moves the slider control, load image using the filname in
// the _images[] array which contains hundreds of images
private void SliderChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (_lastImage != null)
_lastImage.Dispose();
var image = Image.FromFile(_images[(int)ImageSlider.Value]);
Snapshot.Source = ImageToBitmapImage(image);
_lastImage = image;
}
private static ImageSource ImageToBitmapImage(Image image)
{
BitmapImage bitmapImage;
using (var ms = new MemoryStream())
{
image.Save(ms, ImageFormat.Jpeg);
bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = new MemoryStream(ms.ToArray());
bitmapImage.EndInit();
}
return bitmapImage;
}
【问题讨论】:
标签: wpf