MemoryStream使用过多的内存,并且不会处理/关闭

时间:2018-10-16 19:32:07

标签: c# memory bitmap memorystream

直到达到System.OutOfMemory异常为止,内存使用率才会上升。 MemoryStream实例的数量也会增加,直到异常发生为止。我尝试使用using(),执行ms.Dispose(),ms.Close(),GC.Collect()等。 这可能是内存泄漏吗?

  while(running){ 
var screen = Screen.PrimaryScreen;
                using(Bitmap bitmap = new Bitmap(screen.Bounds.Width, screen.Bounds.Height)) {
                    using(var g = Graphics.FromImage(bitmap)) {
                        g.CopyFromScreen(screen.Bounds.Left, screen.Bounds.Top, 0, 0, screen.Bounds.Size);
                    }
                    using(EncoderParameters encoderParams = new EncoderParameters(1)) {
                        encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, ssQuality);
                        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
                        ImageCodecInfo jgpEncoder = codecs[1];
                        using(var ms = new MemoryStream()) {
                            bitmap.Save(ms, jgpEncoder, encoderParams);
                            image img2 = new image();
                            img2.Img = Image.FromStream(ms);
                            binF.Serialize(client.GetStream(), img2);
                        }
                    }
                }
}

VS内存视图:

Memory View VS

任务管理器进程的内存使用情况:

Task Manager memory usage of the process

1 个答案:

答案 0 :(得分:0)

您需要处理从Image.FromStream(ms);返回的图像,例如像这样:

ms.Position = 0; // Rewind the stream.
using (var image2 = Image.FromStream(ms)) 
{ 
    image img2 = new image { Img = image2 };
    binF.Serialize(client.GetStream(), img2);
}

这将确保不仅迅速处置第二张图像的资源,而且MemoryStream ms更有可能被迅速地垃圾收集。由于Image保留对创建它的流的引用,因此当前没有发生。在docs中提到了以下状态:

  

您必须在图像的生命周期内保持流打开。