我正在为与IBM大型机交互的COM库创建一个包装器。它只能从单个线程访问。为了解决这个问题,我创建了一个System.Windows.Threading.Dispatcher来处理在专用线程上运行的所有交互。
我的问题是,如果没有显式处理该对象,则在WinForm应用程序退出后,调度程序将继续运行。永远不会为创建调度程序的对象调用finalize方法。我需要可靠地关闭会话以防止不必要的连接。
如果我在申请退出时调用GC.Collect,它将会关闭。但是,我创建的库将被大多数没有经验的开发人员使用。我不能指望他们总是Disposing,收集垃圾或所有提交到WinForms或WPF挂钩到应用程序退出事件。
我读过如果一个类有一个终结器,它的清理就会得到deferred until later。这可能是问题的一部分,但我可以找到一个终结者?
答案 0 :(得分:1)
永远不会为创建调度程序的对象调用finalize方法
当GC决定执行垃圾收集时,调用终结器。当您需要明确处理资源时,不应该依赖终结器,因为您不应该干扰GC工作。
我不能指望他们总是处置
我害怕,你别无选择。实施IDisposable
并强制您的用户致电Dispose
。这是.NET中的常规做法。
答案 1 :(得分:1)
在Winforms应用程序中使用WPF的调度程序并不是一个好主意。检查this answer是否有等效的Winforms方法。
获取COM对象,否则不会花费太多精力。只需将线程的IsBackground属性设置为true即可。当程序的主线程退出时,这将使CLR自动中止线程。然后CLR运行一个最终的垃圾收集,完全相当于你明确调用GC.Collect()。