处理和内存流
本文关键字:内存 处理 | 更新日期: 2023-09-27 17:50:44
我有以下代码,每秒调用4次并更新网格的背景。当我不处理内存流时,内存输出使用缓慢增长并下降。MemoryStream有一个Dispose函数,但是如果我在处理源位图之后调用它,背景只是白色的。
我需要处理流吗?如果我这么做了,我做错了什么?
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线程
来自BitmapImage
的MSDN文档(我的重点):
设置CacheOption属性为BitmapCacheOption。如果你愿意,OnLoad 在BitmapImage创建后关闭流。默认的OnDemand缓存选项保留对流的访问,直到位图被删除需要,并且清理由垃圾收集器处理。
首先,您发现如果您处理内存流,位图会受到影响,这意味着您的ImageBrush看起来是白色的。所以-不要释放内存流。
第二,也是更重要的,您所看到的内存消耗模式——内存越来越多,然后突然下降——是正常的。当垃圾收集器自行决定运行时,就会发生这种情况。这根本不是问题。
所以不要处理内存流,让垃圾收集器完成它的工作,不要担心它。
看,也许这个答案会对你有帮助。
Using语句中的MemoryStream -我需要调用close()吗
如果你把MemoryStream放在using语句中,你不需要Dispose,因为它会自动处理;)
希望对大家有所帮助