处理和记忆流

时间:2014-03-17 18:47:09

标签: c# garbage-collection managed

我有以下代码,每秒调用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线程

3 个答案:

答案 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,因为它会自动执行;)

我希望这会有所帮助