处理和内存流

本文关键字:内存 处理 | 更新日期: 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,因为它会自动处理;)

希望对大家有所帮助