【发布时间】:2013-03-21 15:44:15
【问题描述】:
有时当我结束应用程序并尝试释放一些 COM 对象时,我会在调试器中收到警告:
检测到
RaceOnRCWCleanUp
如果我编写了一个使用 COM 对象的类,我是否需要在 IDisposable.Dispose 中实现 IDisposable 并在它们上调用 Marshal.FinalReleaseComObject 才能正确释放它们?
如果Dispose没有被手动调用,我还需要在终结器中释放它们还是GC会自动释放它们?现在我call Dispose(false) in the finalizer 但我想知道这是否正确。
我使用的 COM 对象也有一个事件处理程序,该类可以监听。显然该事件是在另一个线程上引发的,那么如果在处置类时触发它,我该如何正确处理它?
【问题讨论】:
-
这提醒我们手动内存管理并不是一个好主意。 MDA 发出警告是因为 COM 服务器中潜在的硬崩溃。试图在应用程序关闭时处理任何东西是没有意义的,它将在一毫秒后完成。 GC 已经知道如何做到这一点,避免提供帮助。