【问题标题】:(.net) CriticalFinalizerObject - What does it really do?(.net) CriticalFinalizerObject - 它到底有什么作用?
【发布时间】:2020-07-18 04:45:12
【问题描述】:

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

【问题讨论】:

  • 如果可以运行某些代码来结束您的对象,那么任务管理器可能无法关闭您的程序。这就是为什么任务管理器“结束进程”会在没有其合作的情况下停止您的进程,将所有执行都带走,从而阻止任何代码的运行、清理或其他方式。
  • 我只注意到应该编辑该问题,或者它已经确定了 OP 对处置与终结的理解中存在问题,如 Finalize() 方法和 Dispose() 方法(以及范例) 完全不同。

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


【解决方案1】:

【讨论】:

  • 嗯,看来 CriticalFinalizerObject 不是我在看的东西。有什么方法可以确定我的 Finalize 方法会被调用,即使有 ctrl+alt+del?
  • 如果您正在寻找可靠的操作,即使操作系统崩溃(断电?),那么您应该考虑事务处理。
  • 我不需要那么多,我只需要在应用程序关闭或ctrl+alt+del'ed时能够运行一些代码。
  • “结束进程”结束进程。无论你想跑什么,都为时已晚。
  • .net 4.0 仍然如此吗?
【解决方案2】:

从我做的几个测试来看,这似乎不是真的。

.Net 中的终结器是非确定性的。这意味着无法保证确切地何时调用终结器。仅仅因为一个对象超出范围甚至被释放,并不意味着终结器将被立即调用。垃圾收集器将在未来某个未知时间处理它。

【讨论】:

  • 好吧,20分钟过去了,它仍然没有执行代码:P
  • 垃圾收集器不关心过去了多少时间。如果没有分配,它将不会运行。所以重要的问题是你的代码在这 20 分钟内做了什么——或者当你退出应用程序时终结器是否运行。
  • 我打开了应用,ctrl+alt+del'ed。
  • 其实我只是简单地关闭了它(现在我想起来了),在控制台应用程序上单击了 X。
【解决方案3】:

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

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

编辑可能比那个概述更好的是ApplicationExit event

【讨论】:

  • 两者似乎都与表单相关,在这种情况下,这实际上是一个控制台应用程序。
【解决方案4】:

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

默认情况下,Dispose 永远不会被调用。您必须自己通过 Finalize 方法调用它。考虑以下事项(为简洁起见,请忽略此处正确完成/处置模式中的明显失败):

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

    ~Foo()
    {
        Dispose();
    } 
}

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2017-07-26
    相关资源
    最近更新 更多