c# - 如何释放/处置/销毁匿名方法中捕获的变量?

标签 c# com dispose anonymous-methods

我正在使用匿名方法来处理 COM 对象中的事件。程序终止后,我在匿名方法中使用的资源似乎没有被“正确关闭”,因为我正在观看的每个资源都会出现第一次机会异常 (InvalidComObjectException)。我想这没什么大不了的,但感觉不“对”。

我想不出一种方法来访问那些在匿名方法范围之外捕获的变量(无论如何,你不应该这样做)。如何在退出应用程序之前关闭/处置资源?

编辑:经过简短的重读,可能不清楚我在这里做什么。我正在编写一个使用 COM 对象的托管应用程序。

进一步编辑:我正在使用 ArcGIS Engine操作 GIS 数据。在这种特殊情况下,我使用 ILayerEvents_Event 中的 VisibilityChanged 事件来监视 GIS 图层何时可见或不可见。该事件仅传递一个 bool 值(可见或不可见)而不是图层名称,因此需要为每个图层创建一个方法来创建它的可见性状态更改。由于我正在处理动态层,因此我需要一种方法以某种方式动态地执行此操作,因此需要匿名方法。

在 anonymoua 方法中,我有一个 ILayer 变量,它从外部循环(在 ILayer 上下文中)获取 ILayerEvents_Event,这样我就知道我正在使用哪个层。正是在这一点上,我被困住了。该功能正常运行,一切都很好,直到我退出该应用程序,将那 20 多个引用留在那里,除了异常之外无处可去。

我不知道用户最后一次隐藏/显示图层的时间,因此无法在最后一次将所有内容清零。我想我可以保持原样(或者,也许有比匿名方法更好的方法),因为它似乎不会造成任何伤害。我只是觉得我错过了什么。

最佳答案

尝试在 C# 中使用不安全模式,在堆上创建内容并在完成后将其删除。另一个想法是将对资源的引用存储在匿名方法之外的变量中,并在程序终止时正确关闭它们。话又说回来,您可能只需要调用 Dispose()。

多一点信息会有所帮助。什么时候抛出异常?资源和“正确关闭”是什么意思。

关于c# - 如何释放/处置/销毁匿名方法中捕获的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/918342/

相关文章:

c# - 如何在 linq 查询中从日期截断时间部分?

c# - 更改 Windows 7 序列号

c# - 无法在 Bootstrap 的 select2 插件中设置选定值

multithreading - 我的MessageWebSocket.OutputStream放置在哪里?

c# - 一次访问字段的最佳线程安全方式,即用于处理

c# - .NET 中的 BODMAS 原理

com - ATL::CComModule::RegisterServer

python - Python win32com 可以在不弹出 GUI 的情况下使用 Visio(或任何程序)吗?

c++ - 如何获取对象的当前引用计数?

c# - 在 EventHandler 中尝试 Set() 时,如何检查 ManualResetEvent 是否已被处置?