(.net)CriticalFinalizerObject - 它到底做了什么?

时间:2009-07-21 03:06:54

标签: c# .net vb.net dispose finalizer

我对这个类的理解是,当你想确定调用Finalizer(析构函数)或类时,你应该使用它,但是从我做过的几个测试中,它似乎不是真的。如果它不能确保调用dispose方法,还有其他方法吗?例如,如果我想确保运行一些代码来结束我的对象,即使我通过任务管理器关闭我的程序还是什么?

4 个答案:

答案 0 :(得分:8)

答案 1 :(得分:2)

  

从我做过的几次测试中,它似乎都不是真的。

<。> .Net中的终结器是非确定性的。这意味着当调用终结器时,无法保证。仅仅因为一个物体超出范围甚至被处理掉,并不意味着将立即调用终结器。垃圾收集器将在未来的某个未知时间绕过它。

答案 2 :(得分:2)

如果真的需要在程序为Ctrl + Alt + Del'd时运行代码,我认为除了拥有监控第一个状态的单独程序之外别无其他办法。如果你真的需要这么多的架构,我想你会想要使用服务和一些客户端应用程序,或者一对或服务。

但是,假设您已经查看了应用程序事件。如果还没有,请查看this overview

编辑可能比ApplicationExit event更好。

答案 3 :(得分:0)

Finalize()方法和Dispose()方法是不同的。

默认情况下,永远不会调用Dispose。你必须自己从Finalize方法调用它。考虑以下情况(为简洁起见,忽略适当的finalize / dispose模式中的明显失败):

public class Foo : IDisposable
{
    public void Dispose() 
    {
        // NOP
    }

    ~Foo()
    {
        Dispose();
    } 
}