0

我正在为与 IBM 大型机交互的 COM 库创建一个包装器。它只能从单个线程访问。为了解决这个问题,我创建了一个 System.Windows.Threading.Dispatcher 来处理在专用线程上运行所有交互。

我的问题是,如果对象没有显式处理,则调度程序会在 WinForm 应用程序退出后继续运行。永远不会为创建调度程序的对象调用 finalize 方法。我需要可靠地关闭会话以防止不必要的连接。

如果我在应用程序退出时调用 GC.Collect,它将正常关闭。但是,我创建的库将被大多数没有经验的开发人员使用。我不能指望他们总是处理、收集垃圾或全部提交到 WinForms 或 WPF 以挂钩应用程序退出事件。

我读过如果一个类有一个终结器,它的清理会被推迟到 later。这可能是问题的一部分,但我可以绕过终结器吗?

4

2 回答 2

1

在 Winforms 应用程序中使用 WPF 的调度程序并不是一个好主意。检查此答案以获取等效的 Winforms 方法。

否则释放 COM 对象并不需要很大的努力。只需将线程的 IsBackground 属性设置为 true。这将使 CLR 在程序的主线程退出时自动中止线程。然后 CLR 运行最后一次垃圾回收,与您显式调用 GC.Collect() 完全相同。

于 2013-09-17T16:24:55.787 回答
1

永远不会为创建调度程序的对象调用 finalize 方法

当 GC 决定执行抓取收集时,将调用终结器。当您需要显式处理资源时,您不应该依赖终结器,因为您不应该干预 GC 工作。

我不能指望他们总是

恐怕,你别无选择。实施IDisposable并强制您的用户调用Dispose. 这是 .NET 中的常规做法。

于 2013-09-17T14:17:32.000 回答