【发布时间】:2010-10-29 10:25:52
【问题描述】:
我正在使用匿名方法来处理 COM 对象中的事件。一旦程序终止,我在匿名方法中使用的资源似乎没有被“正确关闭”,因为我看到的每个资源都会出现第一次机会异常 (InvalidComObjectException)。我想这没什么大不了的,但感觉并不“正确”。
我无法理解在匿名方法范围之外访问那些捕获的变量的方法(无论如何,您不应该这样做)。如何在退出应用程序之前关闭/处置资源?
编辑:经过简短的重新阅读后,我可能不清楚我在这里做什么。我正在编写一个使用 COM 对象的托管应用程序。
进一步编辑:我正在使用ArcGIS Engine 来操作 GIS 数据。在这种特殊情况下,我使用 ILayerEvents_Event 中的 VisibilityChanged 事件来监视 GIS 图层何时可见或不可见。该事件仅传递一个布尔值(可见或不可见)而不是图层名称,因此需要为每个图层创建一个方法来创建其可见性状态更改。由于我正在处理动态层,因此我需要一种以某种方式动态执行此操作的方法,因此需要匿名方法。
在 anonymoua 方法中,我有一个 ILayer 变量,它从外部循环(在 ILayer 上下文中)获取 ILayerEvents_Event,以便我知道我正在使用哪个层。正是在这一点上,我被困住了。在我退出应用程序之前,该功能正常工作,一切都很好,留下这 20 多个引用挂在那里无处可去,只能例外。
我不知道用户何时会最后一次隐藏/显示图层,因此无法在最后一次将内容清空。我想我可以保持原样(或者,也许有比匿名方法更好的方法),因为它似乎没有伤害任何东西。我只是觉得我错过了一些东西。
【问题讨论】:
-
你知道当你一直在不停地做某事并最终突破它时的感觉吗?我在那里。感谢大家的帮助(包括来自单独帖子的 Marc Gravell)。我最终不得不保留一个 COM 对象列表和附加到它们的事件的匿名方法,然后在关闭之前取消注册委托。这使得事情在不抛出异常的情况下工作。
标签: c# com dispose anonymous-methods