arcengine 开发几个注意释放内存的地方
2017-01-12 12:21
465 查看
在循环、查询过程中经常出现如下错误:
1 、循环的 游标一定要释放不然会报错。
2 关于查询(ISpatialFilter,IQueryFilter):
//该路线编码路段数量
IQueryFilter queryfilterall = new QueryFilterClass();
queryfilterall.WhereClause = " [LXBM]= "+ lxbm;
LDBM_MAXCOUNT = m_featcls.FeatureCount(queryfilterall);
//起始值
start_index = Convert.ToInt32(start_lxh);
IQueryFilter queryfilter = new QueryFilterClass();
queryfilter.WhereClause = " [LDBM]= "+ start_ldbm;
IFeatureCursor featcursor = m_featcls.Search(queryfilter, true);//最好是true
参考:http://www.cnblogs.com/gisoracle/archive/2012/01/28/2330541.html
为true分析:pFeatures集合存储了指向FeatureClass上所有Feature的引用,但是由于Recycling参数设置为TRUE也就是说每执行一个NextFeautre方法上一条记录的Feature值在内存中被回收,所以到最后遍历pFeatures集合的时候所有的IFeature引用指向的Feature对象都为Null。
未false分析:分析:pFeatures集合存储了指向FeatureClass上所有Feature的引用,但是由于Recycling参数设置为False也就是说每执行一个NextFeautre方法上一条记录的Feature值在内存中依然存在,所以到最后遍历pFeatures集合的时候所有的IFeature引用指向的Feature对象都依然存在。所以会执行的很Happy(如下图所示):
1 、循环的 游标一定要释放不然会报错。
private void find_allroads_lxbm(IFeature feature_ld, string lxbm) { try { ISpatialFilter spatialfilter = new SpatialFilterClass(); spatialfilter.WhereClause = "[LXBM] = " + lxbm; spatialfilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; //feature_ld该路段 feature_last下一路段 while (feature_ld != null) { IPolyline polyline = feature_ld.Shape as IPolyline; //缓冲 IPoint end_pt = polyline.ToPoint; ITopologicalOperator topo2 = end_pt as ITopologicalOperator; IGeometry geo_buffer_end = topo2.Buffer(1); spatialfilter.Geometry = geo_buffer_end; IFeatureCursor featcursor_lastld = m_featcls.Search(spatialfilter, true); IFeature feature_last = featcursor_lastld.NextFeature(); try { while (feature_last != null) { /****省略***/ } } catch (Exception exx) { MessageBox.Show(exx.ToString()); } //下一个 feature_ld = feature_last; System.Runtime.InteropServices.Marshal.ReleaseComObject(featcursor_lastld); } System.Runtime.InteropServices.Marshal.ReleaseComObject(spatialfilter); ////垃圾回收 System.GC.Collect(); System.GC.WaitForPendingFinalizers(); } catch (Exception exx) { MessageBox.Show(exx.ToString()); } }
2 关于查询(ISpatialFilter,IQueryFilter):
//该路线编码路段数量
IQueryFilter queryfilterall = new QueryFilterClass();
queryfilterall.WhereClause = " [LXBM]= "+ lxbm;
LDBM_MAXCOUNT = m_featcls.FeatureCount(queryfilterall);
//起始值
start_index = Convert.ToInt32(start_lxh);
IQueryFilter queryfilter = new QueryFilterClass();
queryfilter.WhereClause = " [LDBM]= "+ start_ldbm;
IFeatureCursor featcursor = m_featcls.Search(queryfilter, true);//最好是true
参考:http://www.cnblogs.com/gisoracle/archive/2012/01/28/2330541.html
为true分析:pFeatures集合存储了指向FeatureClass上所有Feature的引用,但是由于Recycling参数设置为TRUE也就是说每执行一个NextFeautre方法上一条记录的Feature值在内存中被回收,所以到最后遍历pFeatures集合的时候所有的IFeature引用指向的Feature对象都为Null。
未false分析:分析:pFeatures集合存储了指向FeatureClass上所有Feature的引用,但是由于Recycling参数设置为False也就是说每执行一个NextFeautre方法上一条记录的Feature值在内存中依然存在,所以到最后遍历pFeatures集合的时候所有的IFeature引用指向的Feature对象都依然存在。所以会执行的很Happy(如下图所示):
相关文章推荐
- 如何在 Linux/Windows/MacOS 上使用 .NET 进行开发
- 如何在 Linux 中安装微软的 .NET Core SDK
- C#.NET获取拨号连接的宽带连接方法
- .NET C#利用ZXing生成、识别二维码/条形码
- C#.Net ArrayList的使用方法
- PowerShell中使用.NET将程序集加入全局程序集缓存
- .net(c#)中的new关键字详细介绍
- 由vbs sort引发.NET Framework之间的关系说明
- C#难点逐个击破(6):C#数据类型与.net framework数据类型
- .NET中的async和await关键字使用及Task异步调用实例
- 基于.NET平台常用的框架和开源程序整理
- .NET中开源文档操作组件DocX的介绍与使用
- .Net中的json操作类用法分析
- .net实现序列化与反序列化实例解析
- .NET中的Timer类型用法详解
- Microsoft .Net Remoting系列教程之二:Marshal、Disconnect与生命周期以及跟踪服务
- 关于.net(C#)中的跨进程访问的问题
- .NET C#使用微信公众号登录网站
- .NET实现父窗体关闭而不影响子窗体的方法
- 详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)