您的位置:首页 > 其它

arcengine 开发几个注意释放内存的地方

2017-01-12 12:21 465 查看
在循环、查询过程中经常出现如下错误:

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(如下图所示):
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  arcgis .net