.NET+AE开发中常见几种非托管对象的释放_第1页
.NET+AE开发中常见几种非托管对象的释放_第2页
.NET+AE开发中常见几种非托管对象的释放_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NET+AE开发中常见几种非托管对象的释放 我们知道.Net中对于内存的管理有两种方式,一种是托管对象管理,另一种是非托管对象管理。而我们通常理解的内存管理就是GC(垃圾收集),虽然GC通过对托管堆的管理,可以使我们有机会从繁锁的诸如内存泄漏之类的问题中解放出来,可以将精力专注于程序的逻辑上。但是将所有的事情都交给GC有时会损及程序的效率,严重的甚至会导致错误。 为什么会出现这种情况呢?问题在于对非托管资源(文件句柄)或者需要特别关照的对象(Bitmap)对象等,GC表现得就有点差强人意了(这句话或许说得并不正确,因为微软设计GC的本意就是用来针对托管对象管理)。如何有效地利用GC来进行内存管理,如何对程序的性能进行优化不是本文讨论的范围。本文的要旨在于AE开发中如何来释放非托管对象。一、AOUninitialize.Shutdown 很多时候我们都会遇到这种情况:在退出AE应用程序中,常常提示这样的错误:“The instruction x references memory at x. The memory could not be read”。出现这种错误的原因主要在于COM对象(非托管对象)没有释放,在我们结束使用它的进程的时候,它阻止我们正常释放它,它释放的优先级高于当前使用它的进程释放的优先级,也就是说进程释放之前,必须先释放掉它。 明白了上面的原理,那么解决这一问题的方法便非常简单,我们只需在应用程序退出之前调用ESRI.ArcGIS.ADF.COMSupport.AOUninitialize.Shutdown()方法即可释放非托管对象了(9.2之前的版本AoUninitialize并不在ESRI.ArcGIS.ADF.COMSupport命名空间下,需注意)。二、Marshal.ReleaseComObject NET开发中,引用COM对象主要是通过RCW(Runtime Callable Wrappers)机制来实现的(有点类似于代理模式)。对于COM对象的释放,GC表现得有点无能为力,因此必须在程序中显示释放掉COM对象占用的资源,否则将会出现一些意想不到的错误。比如重复地从Personal GeoDataBase中打开GeoDataBase Cursors而又没有及时释放,将会引发“No more tables can be opened.”其它情形中,你可能会发现应用程序退出时,COM对象依然在内存中引用。比如StyleGallery如果没有显示释放,在应用程序退出时就会引发错误。1、Releasing StyleGallery: 1. private void MyFunction() 2. 3. IStyleGallery styCls = new StyleGalleryClass() as IStyleGallery;4. / Use the StyleGalleryClass here .5. int refsLeft = 0;6. do7. 8. refsLeft = Marshal.ReleaseComObject(styCls);9. 10. while (refsLeft 0);11. 复制代码2、Releasing geodatabase cursors 1.2. for (int i = 1; i 2500; i+)3. 4. IQueryFilter qu = New QueryFilterClass();5. qu.WhereClause = Area = + i.ToString();6. IFeatureCursor featCursor = featClass.Search(qu, true);7. / Use the feature cursor as required8. System.Runtime.InteropServices.Marshal.ReleaseComObject(featCursor);9. 复制代码3、Releasing WebObject(ArcGIS Server) 1. private void doSomthing_Click(object sender, System.EventArgs e)2. 3. using (WebObject webobj = new WebObject()4. 5. ServerConnection serverConn = new ServerConnection(doug, true);6. IServerObjectManager som = serverConn.ServerObjectManager;7. IServerContext ctx = som.CreateServerContext(Yellowstone,MapServer);8. IMapServer mapsrv = ctx.ServerObject as IMapServer;9. IMapServerObjects mapo = mapsrv as IMapServerObjects;10. IMap map = mapo.get_Map(mapsrv.DefaultMapName);11. IFeatureLayer flayer = map.get_Layer(0) as IFeatureLayer;12. IFeatureClass fclass = flayer.FeatureClass;13. IFeatureCursor fcursor = fclass.Search(null, true);14. webobj.ManageLifetime(fcursor);15. IFeature f = null;16. while (f = fcursor.NextFeature() != null)17. 18. / do something with the feature19. 20. ctx.ReleaseContext();21. 22. 三

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论