在循环里面New 很多次的话,会不会有内存问题? for(int i=0;i<=100000;i++){EXIFMetaData em = new EXIFMetaData();EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);}比如这样? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 和new是否多没有关系。只要这个对象没有被任何引用变量引用,就会被回收。 不用你操心,。net有垃圾回收,我还曾经试过,开始内存会增长,增长到一定程度就不动了。 EXIFMetaData em = new EXIFMetaData();EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);string makesoftware = m.MakeSoftware.DisplayValue;这样呢? 必然比不new费内存 。但距离出问题还有段距离,因为你不能一直保持变量被使用,所以定时被回收了,同时存在的,也就那么几个而已。 几十万次也没啥,回收机制不是很了解,但肯定不会让内存中留着这几十万个数据,都被清理了。但具体清理时机不清楚,内存不足,这种new 造成的可能很小,找找什么连接啥的,看是怎么连接的,取出来数据怎么处理的。 若new出的对象都在使用,那可能使内存不足 System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName);找到了我把try catch 去掉以后 报的内存错误是在这地方但是这个对象我用完以后就释放掉了啊?这是怎么回事 你写一个静态类,专处理EXIFMetaData类里的EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);这个逻辑,这样就不用实例化对象了,很轻松就能解决这问题 public Metadata GetEXIFMetaData(string PhotoName) { // 创建一个图片的实例 System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName); // 创建一个整型数组来存储图像中属性数组的ID int[] MyPropertyIdList = MyImage.PropertyIdList; //创建一个封闭图像属性数组的实例 PropertyItem[] MyPropertyItemList = new PropertyItem[MyPropertyIdList.Length]; //创建一个图像EXIT信息的实例结构对象,并且赋初值 #region 创建一个图像EXIT信息的实例结构对象,并且赋初值 Metadata MyMetadata = new Metadata(); MyMetadata.DatePictureTaken.Hex = "9003"; // MyMetadata.Ver.Hex = "9000"; // MyMetadata.MakeSoftware.Hex = "131"; #endregion // ASCII编码 System.Text.ASCIIEncoding Value = new System.Text.ASCIIEncoding(); int index = 0; int MyPropertyIdListCount = MyPropertyIdList.Length; if (MyPropertyIdListCount != 0) { foreach (int MyPropertyId in MyPropertyIdList) { MyPropertyItemList[index] = MyImage.GetPropertyItem(MyPropertyId); #region 初始化各属性值 string myPropertyIdString = MyImage.GetPropertyItem(MyPropertyId).Id.ToString("x"); switch (myPropertyIdString) { //case "9000": // { // MyMetadata.Ver.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value); // MyMetadata.Ver.DisplayValue = Value.GetString(MyPropertyItemList[index].Value); // break; // } case "9003": { MyMetadata.DatePictureTaken.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value); MyMetadata.DatePictureTaken.DisplayValue = Value.GetString(MyPropertyItemList[index].Value); break; } case "131": { if (MyImage.GetPropertyItem(MyPropertyId).Value != null) { MyMetadata.MakeSoftware.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value); MyMetadata.MakeSoftware.DisplayValue = Value.GetString(MyPropertyItemList[index].Value); break; } else { break; } } //省略N行相似代码 } #endregion index++; } MyImage.Dispose(); } return MyMetadata; }整个方法 EXIFMetaData em = null;for(int i=0;i<=100000;i++){em = new EXIFMetaData();EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);} lz自己调试吧,期待看到这个问题有个结果,lz最终可以工具解决方法。比如你应该首先判断文件里是否真的是图片数据,然后才交给这个方法(这个方法很蠢地会对错误的图片格式也先去胡乱申请内存的)。我看到的lz的最大的问题,不是所谓内存问题,而是lz滥用try...catch,耽误了开发效率。开发应该以自动测试为驱动,应用程序应该在表现层统一处理异常,而其他层次的开发并不需要掩盖异常。写下try...catch代码的程序员有80%都是自欺欺人的。 1、我认为(只是我自己认为),Dispose只是释放(单纯的释放),释放后应该不会即时被回收。LZ试试GC.Collect();可以吧,释放后进行强制回收。2、建议LZ换个头像,真的让人作呕。 呃,你从哪儿看出来我滥用 try...catch咧?我上面的代码都没用这个 简单的学生信息排序问题,(接口) 一个WPF项目里需要好多窗口,这些窗口具有一些共同的属性设置,怎么把这些共同的属性设置放到style里,然后放到资源字典里? 内核驱动程序通信都采用了什么办法? 一个很简单的问题(关闭网页) 在textBox中遇叹号和空格换行 JJGG们啊,下面一小段代码错在哪里啊?怎么改正啊? 再问一个小问题 怎么会提示这样的连接错误,我快昏死了,朋友们多帮帮忙 求这样一个正则表达式!!!过来看看。 winform窗体背景图片的问题 c#如何按行读取mysql里某字段的内容 分享:WEB后台定时任务服务类及实现源代码
只要这个对象没有被任何引用变量引用,就会被回收。
EXIFMetaData em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
string makesoftware = m.MakeSoftware.DisplayValue;这样呢?
但具体清理时机不清楚,内存不足,这种new 造成的可能很小,找找什么连接啥的,看是怎么连接的,取出来数据怎么处理的。
System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName);找到了我把try catch 去掉以后 报的内存错误是在这地方
但是这个对象我用完以后就释放掉了啊?
这是怎么回事
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
这个逻辑,这样就不用实例化对象了,很轻松就能解决这问题
{
// 创建一个图片的实例
System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName);
// 创建一个整型数组来存储图像中属性数组的ID
int[] MyPropertyIdList = MyImage.PropertyIdList;
//创建一个封闭图像属性数组的实例
PropertyItem[] MyPropertyItemList = new PropertyItem[MyPropertyIdList.Length];
//创建一个图像EXIT信息的实例结构对象,并且赋初值 #region 创建一个图像EXIT信息的实例结构对象,并且赋初值
Metadata MyMetadata = new Metadata();
MyMetadata.DatePictureTaken.Hex = "9003";
// MyMetadata.Ver.Hex = "9000"; //
MyMetadata.MakeSoftware.Hex = "131"; #endregion // ASCII编码
System.Text.ASCIIEncoding Value = new System.Text.ASCIIEncoding(); int index = 0;
int MyPropertyIdListCount = MyPropertyIdList.Length;
if (MyPropertyIdListCount != 0)
{
foreach (int MyPropertyId in MyPropertyIdList)
{
MyPropertyItemList[index] = MyImage.GetPropertyItem(MyPropertyId); #region 初始化各属性值
string myPropertyIdString = MyImage.GetPropertyItem(MyPropertyId).Id.ToString("x");
switch (myPropertyIdString)
{
//case "9000":
// {
// MyMetadata.Ver.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
// MyMetadata.Ver.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
// break;
// }
case "9003":
{
MyMetadata.DatePictureTaken.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
MyMetadata.DatePictureTaken.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
break;
}
case "131":
{
if (MyImage.GetPropertyItem(MyPropertyId).Value != null)
{
MyMetadata.MakeSoftware.RawValueAsString = BitConverter.ToString(MyImage.GetPropertyItem(MyPropertyId).Value);
MyMetadata.MakeSoftware.DisplayValue = Value.GetString(MyPropertyItemList[index].Value);
break;
}
else
{
break;
}
}
//省略N行相似代码
}
#endregion index++;
}
MyImage.Dispose(); }
return MyMetadata;
}
整个方法
EXIFMetaData em = null;
for(int i=0;i<=100000;i++)
{
em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
}
LZ试试GC.Collect();可以吧,释放后进行强制回收。2、建议LZ换个头像,真的让人作呕。
我上面的代码都没用这个