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会也被释放,两者指向相同物理地址。

  综上所述,开发过程中如有全局对象,并且想解决自身应用程序对文件释放问题,代码中就需要考虑,对象释放,和被释放后重新启用的代码机制。