WinForm程序 未处理OutOfMemoryException的异常问题【急求】

空白画映 2014-01-09 10:29:38
在程序里写了一段代码是将单据号生成条码,当单据过多3000多条时处理到2000多条就报出这个异常,内存占用超了。
具体代码如下

/// <summary>
/// 根据单据号创建条码
/// </summary>
/// <param name="BillsNo">单据号</param>
/// <returns></returns>
private static string CreateBarcode(string BillsNo)
{
using (BarcodeLib.Barcode b = new BarcodeLib.Barcode())
{
int W = 400;//图片的宽
int H = 100;//图片的高
b.Alignment = BarcodeLib.AlignmentPositions.LEFT;//图片居中
BarcodeLib.TYPE type = BarcodeLib.TYPE.Interleaved2of5;//设置条码格式
byte[] imgBytes = null;
try
{
if (type != BarcodeLib.TYPE.UNSPECIFIED)
{
b.IncludeLabel = false;//条码下面是否显示值
b.RotateFlipType = (RotateFlipType)Enum.Parse(typeof(RotateFlipType), "RotateNoneFlipNone", true);//设置条码的旋转方式
b.LabelPosition = BarcodeLib.LabelPositions.BOTTOMCENTER;//设置把条码搁置那个位置
Image img = b.Encode(type, BillsNo, Color.Black, Color.White, W, H);//生成图片
imgBytes = imageToByteArray(img);
}
return Convert.ToBase64String(imgBytes);
}
catch
{
throw;
}
}
}
/// <summary>
/// 图片转为Byte字节数组
/// </summary>
/// <param name="FilePath">路径</param>
/// <returns>字节数组</returns>

private static byte[] imageToByteArray(Image img)
{
using (Image imgIn = new Bitmap(img))
{
using (MemoryStream ms = new MemoryStream())
{
img.Save(ms, ImageFormat.Bmp);
return ms.ToArray();
}
}
}


下面是通过VS的分析工具分析出来的截图



请求各位大大帮忙分析一下是什么原因。
...全文
578 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
小猪八Q 2014-01-09
  • 打赏
  • 举报
回复
在使用Convert.ToBase64String的过程中,由于字符串的大量操作,引起内存不足。 试试楼上的建议吧,强制回收内存试试
本拉灯 2014-01-09
  • 打赏
  • 举报
回复
还有能Close的在函数返回前先Close掉,看看MemoryStream 把这个先关掉再return 其他的类也是一样。
本拉灯 2014-01-09
  • 打赏
  • 举报
回复
引用 5 楼 junjie94bei 的回复:
[quote=引用 4 楼 wyd1520 的回复:]

 Image img = b.Encode(type, BillsNo, Color.Black, Color.White, W, H);//生成图片
 imgBytes = imageToByteArray(img);
 img.Dispose(); <--这个图生成后 要消毁了。不销就会注流在内存里
我添加了还是不行。[/quote] 在那个调用函数的后面加个GC.xxx强制内存回收试试吧。有可能是内存没来的得销毁。结果用满了。
空白画映 2014-01-09
  • 打赏
  • 举报
回复
引用 4 楼 wyd1520 的回复:

 Image img = b.Encode(type, BillsNo, Color.Black, Color.White, W, H);//生成图片
 imgBytes = imageToByteArray(img);
 img.Dispose(); <--这个图生成后 要消毁了。不销就会注流在内存里
我添加了还是不行。
本拉灯 2014-01-09
  • 打赏
  • 举报
回复

 Image img = b.Encode(type, BillsNo, Color.Black, Color.White, W, H);//生成图片
 imgBytes = imageToByteArray(img);
 img.Dispose(); <--这个图生成后 要消毁了。不销就会注流在内存里
wayu002 2014-01-09
  • 打赏
  • 举报
回复
试下为CreateBarcode函数里的Image对象调用Dispose()方法呢?
空白画映 2014-01-09
  • 打赏
  • 举报
回复
BarcodeLib的对象也USING了也Dispose() Img也 img.Dispose()了还是不行啊!
空白画映 2014-01-09
  • 打赏
  • 举报
回复
顶起来,各位大大搂一眼啊!
空白画映 2014-01-09
  • 打赏
  • 举报
回复
引用 10 楼 wyd1520 的回复:
[quote=引用 9 楼 junjie94bei 的回复:] [quote=引用 8 楼 wpfLove 的回复:] 在使用Convert.ToBase64String的过程中,由于字符串的大量操作,引起内存不足。 试试楼上的建议吧,强制回收内存试试
我发现了问题,是Convert.ToBase64String 返回后存入DataSet 因为有3000多条数据也就是3000多个条码图片 一个 条码 图片占用 16W字节 3000多个 存入Database第2000多的时候就异常了。[/quote] 找到问题就好,你真牛。放到DataSet里。。。。。不释放。。。[/quote] 呵呵,我先存入内存然后再用微软的RDLC绑定DataSet,想偷个懒,不想分批生成,不过我把代码 img.Save(ms, ImageFormat.Bmp); 改成ImageFormat.Jpeg 就会小很多。3000多张才 200多M内存
本拉灯 2014-01-09
  • 打赏
  • 举报
回复
引用 9 楼 junjie94bei 的回复:
[quote=引用 8 楼 wpfLove 的回复:] 在使用Convert.ToBase64String的过程中,由于字符串的大量操作,引起内存不足。 试试楼上的建议吧,强制回收内存试试
我发现了问题,是Convert.ToBase64String 返回后存入DataSet 因为有3000多条数据也就是3000多个条码图片 一个 条码 图片占用 16W字节 3000多个 存入Database第2000多的时候就异常了。[/quote] 找到问题就好,你真牛。放到DataSet里。。。。。不释放。。。
空白画映 2014-01-09
  • 打赏
  • 举报
回复
引用 8 楼 wpfLove 的回复:
在使用Convert.ToBase64String的过程中,由于字符串的大量操作,引起内存不足。 试试楼上的建议吧,强制回收内存试试
我发现了问题,是Convert.ToBase64String 返回后存入DataSet 因为有3000多条数据也就是3000多个条码图片 一个 条码 图片占用 16W字节 3000多个 存入Database第2000多的时候就异常了。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧