MemoryStream использует слишком много памяти и не удаляет / закрывает - PullRequest
0 голосов
/ 16 октября 2018

Использование памяти увеличивается, пока не достигнет 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 голосов
/ 16 октября 2018

Вам необходимо избавиться от изображения, возвращенного с 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 сохраняет ссылку на поток, из которого он был создан.Это упоминается в документах , в которых указано:

Вы должны держать поток открытым в течение всего времени жизни изображения.

...