调度员在退出时不会处置

时间:2013-09-17 13:59:26

标签: c# .net idisposable dispatcher

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

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

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

我读过如果一个类有一个终结器,它的清理就会得到deferred until later。这可能是问题的一部分,但我可以找到一个终结者?

2 个答案:

答案 0 :(得分:1)

  

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

当GC决定执行垃圾收集时,调用终结器。当您需要明确处理资源时,不应该依赖终结器,因为您不应该干扰GC工作。

  

我不能指望他们总是处置

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

答案 1 :(得分:1)

在Winforms应用程序中使用WPF的调度程序并不是一个好主意。检查this answer是否有等效的Winforms方法。

获取COM对象,否则不会花费太多精力。只需将线程的IsBackground属性设置为true即可。当程序的主线程退出时,这将使CLR自动中止线程。然后CLR运行一个最终的垃圾收集,完全相当于你明确调用GC.Collect()。