从.NET的内存中释放ArcObjects的规则是什么?


Answers:


18

最值得注意的是,在使用完游标后,请务必显式释放它们。我也释放这意味着数据库访问一些枚举对象,例如IEnumRelationship你得到IRelationshipClass.GetRelationshipsForObject

同样,当您创建许多寿命很短的COM实例(尤其是在紧密循环中)时,显式释放它们也是一个好主意。

在某些情况下,建议何时发布单个功能(行)引用。例如,如果您创建新的地理数据库版本,编辑数据,进行协调和发布,则之后尝试删除该版本的尝试可能会失败,因为可能存在未发布的行,而这些行又保留了您要删除的版本(工作区)的引用。但是,大多数情况下,这种情况很少见,您无需在日常ArcObjects开发中考虑它们。这只会使代码杂乱无章地进行清理,使其难以维护。

同样重要的是要说何时不发布.NET包装器- 切勿显式发布任何其他托管代码可能正在使用的ArcObjects的RCW。这样的一个例子-在ArcMap中时不要释放IMap。通常,请勿尝试释放未创建的ArcObjects。



2

始终销毁:

  • 游标
  • IEnums

注意不要破坏正在其他地方使用的东西。

今天,我在Kirk参加的ESRI网站上阅读了一个有趣的讨论。还有其他非常有趣的意见,例如,使用ReleaseComObject方法和FinalReleaseComObject(或类似的东西)。抱歉,我现在没有链接。

一些人甚至建议发布IRows,但是许多人同意让GC直接处理它们更加容易。

我从不发布任何IGeometry。有人尝试过吗?


1

我将使用ESRI.ArcGIS.ADF.ComReleaser。话虽这么说,我不能确切确定哪个弧对象使用确定性释放模式,但我主要将其附加到IServerContext对象,因为这是最关键的。

using (ComReleaser comReleaser = new ComReleaser())
{

}

这是我在2011年esri开发者峰会上获得的一些信息。

我记得的最大清单是关于单例对象的(帮助中有两个主题)。

这是来自在.NET“释放COM引用”主题中使用ArcObjects的最佳实践的链接:http : //help.arcgis.com/zh-cn/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Releasing_COM_references/0001000004tm000000/

这是地理数据库博客上的一篇关于Fourm讨论的帖子,其中确实包含对象列表:http : //blogs.esri.com/dev/blogs/geodatabase/archive/2010/05/18/what_2700_s‑up‑with ‑comreleaser_3f00_.aspx

(最后是一篇博客文章,其中包含可帮助防止网址无法正常工作的链接) http://blogs.esri.com/dev/blogs/geodatabase/archive/2008/12/18/using-the-comreleaser-to-manage .net.aspx中的“生命周期”


使用IServerContext时,更关键的是(比起像ComReleaser一样释放.NET RCW)在它上面调用ReleaseContext。最好的方法是将上下文包装在实现IDisposable的.NET类中(并遵循包括实现终结器的标准处理模式)
Petr Krebs

@Petr是的releaseContext很大,我并没有忽略它,但是感谢您以书面形式将其提供给其他所有人。
史蒂夫

2
我相信ComReleaser是32位程序集的一部分,这意味着您将无法在64位进程(例如ArcGIS Server)中运行ComReleaser。我当时写的是国有企业,对此不知所措。
bcollins

服务器发布还有其他选择吗?
VBAHole

@VBA不是我所注意到的。即使在10.5.1 arcobjects。
史蒂夫

0

不要忘记IWorkspace对象。几年前,在ESRI开发者峰会上,我提出了问题,而ESRI的答案是ICursor和IWorkspace对象。


释放工作空间是没有意义的,因为它们是由工作空间工厂单例缓存的。
普雷斯顿

0

SOI中使用游标之类的服务器对象时,规则是否不同?我正在尝试使用ComReleaser,但是每次它到达我的SOI代码中的方法附近时,它都会失败


不要发布问题作为对现有问题的答案。将其发布为新问题,并带有指向现有问题的链接。
比约恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.