for(int i=0;i<=100000;i++)
{
EXIFMetaData em = new EXIFMetaData();
EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
}比如这样?

解决方案 »

  1.   

    和new是否多没有关系。
    只要这个对象没有被任何引用变量引用,就会被回收。
      

  2.   

    不用你操心,。net有垃圾回收,我还曾经试过,开始内存会增长,增长到一定程度就不动了。
      

  3.   


    EXIFMetaData em = new EXIFMetaData();
    EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
    string makesoftware = m.MakeSoftware.DisplayValue;这样呢?
      

  4.   

    必然比不new费内存 。但距离出问题还有段距离,因为你不能一直保持变量被使用,所以定时被回收了,同时存在的,也就那么几个而已。
      

  5.   

    几十万次也没啥,回收机制不是很了解,但肯定不会让内存中留着这几十万个数据,都被清理了。
    但具体清理时机不清楚,内存不足,这种new 造成的可能很小,找找什么连接啥的,看是怎么连接的,取出来数据怎么处理的。
      

  6.   

    若new出的对象都在使用,那可能使内存不足
      

  7.   


    System.Drawing.Image MyImage = System.Drawing.Image.FromFile(PhotoName);找到了我把try catch 去掉以后 报的内存错误是在这地方
    但是这个对象我用完以后就释放掉了啊?
    这是怎么回事
      

  8.   

    你写一个静态类,专处理EXIFMetaData类里的
    EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
    这个逻辑,这样就不用实例化对象了,很轻松就能解决这问题
      

  9.   

     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;
        }
    整个方法
      

  10.   


    EXIFMetaData em = null;
    for(int i=0;i<=100000;i++)
    {
    em = new EXIFMetaData();
    EXIFMetaData.Metadata m = em.GetEXIFMetaData(filePath);
    }
      

  11.   

    lz自己调试吧,期待看到这个问题有个结果,lz最终可以工具解决方法。比如你应该首先判断文件里是否真的是图片数据,然后才交给这个方法(这个方法很蠢地会对错误的图片格式也先去胡乱申请内存的)。我看到的lz的最大的问题,不是所谓内存问题,而是lz滥用try...catch,耽误了开发效率。开发应该以自动测试为驱动,应用程序应该在表现层统一处理异常,而其他层次的开发并不需要掩盖异常。写下try...catch代码的程序员有80%都是自欺欺人的。
      

  12.   

    1、我认为(只是我自己认为),Dispose只是释放(单纯的释放),释放后应该不会即时被回收。
    LZ试试GC.Collect();可以吧,释放后进行强制回收。2、建议LZ换个头像,真的让人作呕。
      

  13.   

    呃,你从哪儿看出来我滥用 try...catch咧?
    我上面的代码都没用这个