我有以下代码,每秒调用4次并更新网格的背景。当我不处理内存流时,内存输出的使用会慢慢增长和下降。 MemoryStream有一个Dispose函数,但如果我在处理Source Bitmap后调用它,背景就是白色。
我需要处理流吗?如果我这样做,我做错了什么?
private void Viewer_OnUpdate(object self, Bitmap sourceBitmap, Int32Rect cropArea)
{
if (sourceBitmap == null)
{
return;
}
this.Dispatcher.BeginInvoke(DispatcherPriority.Render,
new Action(
() =>
{
MemoryStream stream = new MemoryStream();
sourceBitmap.Save(stream, ImageFormat.Bmp);
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
stream.Seek(0, SeekOrigin.Begin);
bitmapImage.StreamSource = stream;
bitmapImage.EndInit();
this.GridContainer.Background =
new ImageBrush(new CroppedBitmap(bitmapImage,cropArea));
sourceBitmap.Dispose();
}));
}
注意:我正在调度,因为调用事件始终来自非UI线程
答案 0 :(得分:3)
来自BitmapImage
的MSDN文档(重点是我的):
如果您愿意,请将CacheOption属性设置为BitmapCacheOption.OnLoad 创建BitmapImage后关闭流。默认 OnDemand缓存选项保留对流的访问,直到位图为止 需要,清理由垃圾收集器处理。
答案 1 :(得分:2)
首先,您发现如果丢弃内存流,位图会受到影响,这意味着您的ImageBrush看起来是白色的。所以 - 不要处置内存流。
其次,更重要的是,您所看到的内存消耗模式 - 越来越多的内存,然后突然下降 - 是正常的。这就是当垃圾收集器自行决定运行时会发生什么。这根本不是问题。
所以不要处理内存流,让垃圾收集器完成它的工作,不要担心它。
答案 2 :(得分:0)
看,也许这个答案可以帮到你。
MemoryStream in Using Statement - Do I need to call close()
如果将MemoryStream放在using语句中,则不需要Dispose,因为它会自动执行;)
我希望这会有所帮助