【问题标题】:Destructor ends before completing its task in C#?析构函数在 C# 中完成其任务之前结束?
【发布时间】:2016-01-03 07:19:28
【问题描述】:

desctructorCheck 类中的以下 destructor 代码会在将近 2 秒后关闭控制台,然后才能从用户那里获得任何输入。

~destructorCheck() {
   Console.WriteLine("Destructor");
   Console.ReadLine( );
}

为什么要关闭? 析构函数是否有任何计时器来完成其清理过程?

【问题讨论】:

标签: c# input destructor


【解决方案1】:

原因在于,析构函数的调用方式:

引用 MSDN:

'程序员无法控制何时调用析构函数 因为这是由垃圾收集器决定的。垃圾 收集器检查不再被 应用。如果它认为一个对象有资格销毁,它 调用析构函数(如果有)并回收用于存储的内存 物体。程序退出时也会调用析构函数。'

我同意阅读 Eric Lippert 的博客是一件好事!

如果您需要确保在销毁 C# 对象时发生某些事情,您可能应该实现 IDisposable 并将您的闭包逻辑放入 Dispose 方法中。

【讨论】:

  • 不幸的是,这是来自 MSDN 的一段误导性文本,因为它暗示首先,GC 在跟踪期间调用析构函数,其次,析构回收内存。更准确的描述是 GC 识别可终结对象并让它们保持活动状态以供终结器线程处理
【解决方案2】:

是的。终结器在被终止之前有有限的运行时间。

这是终结器成为最后手段的众多原因之一。它们不能保证首先运行,也不能保证完成。它们之所以运行,只是因为框架现在确实需要该对象消失——要么是因为它需要内存而对它进行 GC,要么你的应用程序正在关闭。

我很确定时间限制约为 2 秒,但我不知道有什么方法可以改变它。

【讨论】:

  • 如果可以,我不会改变它!
  • 我也不会,但这通常是那些真正想滥用它们的人的直接后续问题。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2018-05-07
  • 1970-01-01
相关资源
最近更新 更多