问题简介:一张报表上面有动态图片预览,预览之后再进行打印预览,打印之后关闭画面。此动作进行多次之后,有些动态图片预览不出来或者是预览出来之后打印预览没图片。
解决过程:
经过代码调试,到下面这个行代码时:
System.Drawing.Image.FromStream(ms, true); 报错为内存不足
然后打开任务管理器 重复问题的动作来监控进程所占内存,经过基本测试 内存占用到1G左右的时候会出现问题。
然后就去搜索有关System.Drawing.Image.FromStream(ms, true); 内存不足的解决方案,经过搜索代码改为如下:
MemoryStream ms = new MemoryStream(bytes);
image = System.Drawing.Image.FromStream(ms, true);
//下面3行为添加代码
ms.Close();
ms.Dispose(); //释放占用资源
System.GC.Collect();//垃圾回收
打印预览画面添加如下代码
void _btnCancel_Click(object sender, EventArgs e)
{
if (_preview.IsRendering)
{
_preview.Cancel();
_preview.Dispose();
}
else
{
this.Dispose();
Close();
}
}
private void CoolPrintPreviewDialog_FormClosed(object sender, FormClosedEventArgs e)
{
this.Dispose();
System.GC.Collect();
}
添加之后再进行重复打印,打印预览时为440MB,关闭打印预览画面 内存占用基本稳定在260MB左右,问题基本解决。
搜索参考:
垃圾回收:
http://www.cnblogs.com/zuozuo/archive/2011/09/22/2185239.html
http://www.blue1000.com/bkhtml/c17/2012-11/70982.htm
图片内存:
http://bbs.csdn.net/topics/390932070
public bool SetPic(byte[] filebytes)
{
MemoryStream ms = new MemoryStream(filebytes);
Image img = Image.FromStream(ms);
ms.Close();
ms.Dispose();
}