[英]MemoryStream uses too much memory and doesn't dispose/close
內存使用率會上升,直到遇到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內存視圖:
任務管理器的內存使用過程:
您需要處理從Image.FromStream(ms);
返回的圖像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
保留對創建它的流的引用。 這在文檔中提到:
您必須在圖像的生命周期內保持流打開。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.