加载中…
个人资料
HHC2017
HHC2017
  • 博客等级:
  • 博客积分:0
  • 博客访问:3,319
  • 关注人气:112
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

arcgis engine释放资源

(2012-05-16 13:52:02)
标签:

杂谈

分类: arcengine
ArcEngine 中存在一些错误。其中最有名的就是对象不能释放资源的问题。
比如打开了一个Shapefile ,除非程序关闭否则就没有办法释放对Shapefile的控制
还有读取ServerStyle文件的时候那个StyleItemEnum只能使用一次。第二次就会出错,
如果在短时间内搜索多个FeatureClass这样就会产生多个FeatureCursor,那么就会出现
打开的游标数目过多或者不能打开更多的表这样的错误。
这些错误都是由于对象不能释放资源所造成的。
可以使用以下方法来释放(C#):
//其中relObj就是要释放的对象。
System.Runtime.InteropServices.Marshal.ReleaseComObject(relObj);
如果要确保被释放了。那么可以循环调用该方法 直到这个方法返回0为止。

比如我写的一个函数,原来是这样:
     static public IRaster ConvertToRaster(IFeatureLayer pFeatLayer, string field, object cellSizeProvider)
        {
            IInterpolationOp pInterpolationOp = new RasterInterpolationOpClass();

            // Define the search radius
            IRasterRadius pRadius = new RasterRadiusClass();

            object Missing = Type.Missing;
            pRadius.SetVariable(12, ref Missing);
            //Create FeatureClassDescriptor using a value field
            IFeatureClassDescriptor pFCDescriptor = new FeatureClassDescriptorClass();
            pFCDescriptor.Create(pFeatLayer.FeatureClass, null, field);

            IRasterAnalysisEnvironment pEnv = pInterpolationOp as IRasterAnalysisEnvironment;
            pEnv.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref cellSizeProvider);

            //Perform the interpolation  就是在这里渲染
            IRaster pOutRaster = pInterpolationOp.IDW(pFCDescriptor as IGeoDataset, 2, pRadius, ref Missing) as IRaster;


            return pOutRaster;
        }


当重复调用的时候,资源释放不了,在
            IRaster pOutRaster = pInterpolationOp.IDW(pFCDescriptor as IGeoDataset, 2, pRadius, ref Missing) as IRaster;
抛出了不能转换的异常:

加上释放资源的代码,变成如下:
        static public IRaster ConvertToRaster(IFeatureLayer pFeatLayer, string field, object cellSizeProvider)
        {
            IInterpolationOp pInterpolationOp = new RasterInterpolationOpClass();

            // Define the search radius
            IRasterRadius pRadius = new RasterRadiusClass();

            object Missing = Type.Missing;
            pRadius.SetVariable(12, ref Missing);
            //Create FeatureClassDescriptor using a value field
            IFeatureClassDescriptor pFCDescriptor = new FeatureClassDescriptorClass();
            pFCDescriptor.Create(pFeatLayer.FeatureClass, null, field);

            IRasterAnalysisEnvironment pEnv = pInterpolationOp as IRasterAnalysisEnvironment;
            pEnv.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref cellSizeProvider);

            //Perform the interpolation  就是在这里渲染
            IRaster pOutRaster = pInterpolationOp.IDW(pFCDescriptor as IGeoDataset, 2, pRadius, ref Missing) as IRaster;

            while(System.Runtime.InteropServices.Marshal.ReleaseComObject(pFCDescriptor)!=0)
            {
            
            }
            while (System.Runtime.InteropServices.Marshal.ReleaseComObject(pInterpolationOp) != 0)
           
            
            }
            //while (System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnv) != 0)
            //{ 
            
            //}

            return pOutRaster;
        }

问题就解决了。这回到我之前类似的一个问题,是不是都是资源释放不了的原因?

0

阅读 收藏 喜欢 打印举报/Report
前一篇:设备分类
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有