gal*_*ets 2 .net garbage-collection
我正在开发一个非常广泛的.NET系统,涉及大量的系统编程.大部分时间,我使用IDisposable模式处理资源处理,但有时这不适用(或错误地遗漏)并且在Finalize()期间资源被破坏.这可能发生在COM互操作中,或者当析构函数调用Dispose()并且其中有异常时.
基本上:当终结器可能抛出时,并不总是能够清楚地看到和处理每个场景.当它发生时,应用程序肯定会崩溃.
我特别关注这类问题的原因是终结器不是由创建或使用对象的线程调用的,因此将异常绑定到创建对象的上下文几乎是不可能的.你得到的只是一些通用的GC线程.
所以,现在向公众提问:如果你解决了这些问题,你会怎么做才能控制它们?标记对象?使用第三方工具来跟踪这些问题?
另外:是否有可能触发某种全局"终结者投掷"事件,至少记录这个问题已经发生?
编辑1:非常感谢所有提交宝贵意见的人,我想我现在对需要做些什么更清楚了.我真的想从这个讨论得到的最后一件事是,如果有人知道在终结器中触发异常代码的方法(即使应用程序崩溃仍然是不可避免的),那么我至少可以记录它,而不必修改每个的析构函数类.
你的问题是基于一个有点错误的前提,即不可能处理Finalizer可能抛出的每个场景.这正是您在此需要实现的目标.在最终确定期间发生的例外将终止该过程.除非异常是真正致命的,在这种情况下让程序崩溃,您应该以不会使程序崩溃的方式处理此异常.
使用Finalizer抛出几乎与使用C++析构函数抛出一样糟糕.IDisposable的大多数实现都为活动(IDisposable.Dispose())和被动(终结器线程)部署操作调用相同的方法.如果Finalizer版本正在抛出,那么主动部署可能或可能也会抛出.这与C++析构函数抛出非常相似,可以防止嵌套资源在某些情况下被正确处理.
不允许异常从终结器传播,除非它们对您的应用程序真正致命.