2015-10-06 85 views
0

以下析构函数代码 desctructorCheck类从用户获取任何输入之前关闭控制台,几乎2秒后。析构函数在C#中完成其任务之前结束?

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

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

+3

您应该阅读Eric Lippert在[终结者]上的博客文章(http://ericlippert.com/2015/05/18/when-everything-you-know-is-wrong-part-one/) – juharr

+1

相关:http ://blog.stephencleary.com/2009/08/finalizers-at-process-exit.html –

+0

@all感谢您的快速可理解的反应和您的推介。 –

回答

2

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

这是众多原因终结是不得已而为之的工具之一。他们不能保证首先运行,并且不保证完成。他们只是运行,因为框架真的需要这个对象消失现在 - 它要么GC'ing它,因为它需要内存,或者你的应用程序正在关闭。

我敢肯定的时间限制为〜2秒,我不知道有什么办法去改变它。

+1

如果可以的话,我不会改变! –

+1

我也不会这样做,但那通常是真正想滥用它们的人的直接后续问题。 :) –

2

的原因是,因为析构函数的调用方式:

引述MSDN:

“的程序员时,因为这是由垃圾收集器决定调用析构函数 无法控制。垃圾 收集器检查 应用程序不再使用的对象。如果它认为某个对象符合销毁条件,则它将调用析构函数(如果有)并回收用于存储对象的内存。程序退出时也会调用析构函数。

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

如果你需要确保当你的C#对象被销毁有事,你应该实现IDisposable,并把您的封闭逻辑放到Dispose方法。

+0

这是来自MSDN的一个令人遗憾的误解,因为它意味着首先,GC在跟踪过程中调用析构函数,其次是销毁回收内存。更准确的描述是,GC标识可终结的对象并且*使终结器线程处于活动状态以处理*。 –