Arc Engine二次开发资源释放问题
时间:2010-10-14 来源:struggle GISer
AE二次开发处理空间数据时,时常遇到资源不能成功释放。
例如:
1)进行数据格式批量转换或者其他批处理数据的应用程序关闭后,其进程仍然在运行。解决办法必须在退出过程中执行AO的Shutdown()接口
2)Personal Geodatabase格式数据即PGDB,对其数据进行处理后,在开发的程序彻底退出关闭之前,以独占的方式打开,导致文件被占用,甚至程序其他的功能类都不能访问该数据,必须退出重启后才能释放。此类问题在数据批量处理,质检等过程中经常遇到。有些公司的开发人员无奈之余采用其他方式避开此问题。
AE各接口二次开发基本不支持多线程,只能有一个线程进行处理。操作空间数据库的各个接口:IWorkpsace,IFeatureWorkspace,IFeatureClass,IFeatureLayer,IFeature,ICursor等使用时,均不能自行释放资源文件。
例如在函数:
public void OperPGDB(string pgdbPathName)
{
IWorkspace pWorkspace =null;
IFeatureClass pFeatureClass = null;
IFeatrureCursor pFeatureCursor = null;
IFeature pFeature = null;
}
函数中,pFeatureCursor,pFeature对pgdbPathName空间PGDB数据文件进行查询操作,读取其中图层要素,执行完该函数后,pgdbPathName就不能执行释放。必须等待程序关闭后,他才会释放文件。如果应用程序在启动关闭的同一个周期内重复其操作访问,就会报出异常。所以在执行之后要对每个对象函数结束就调用Release的函数对其释放。
3)上述2)及时释放了资源,但是对IFeatureClass,IWorkspace接口释放时,需要注意:应用程序多个功能类中,均有接口对象,指定同一个文件或者同一个文件时释放操作就要谨慎。
例如:
calss A
{
IFeatureClass pFeatureClass = null;
}
calss B
{
IFeatureClass pFeatureClass = null;
}
A a = new A();
B b = new B();
A、B两个对象均有pFeatureClass,如果指向同一个文件的同一图层,那在释放A.pFeatureClass时,B的pFeatureClass会也被释放,两者指向相同物理地址。
综上所述,开发过程中如有全局对象,并且想解决自身应用程序对文件释放问题,代码中就需要考虑,对象释放,和被释放后重新启用的代码机制。