我在 C# 中有一个类,我想在处理我的类时正确关闭一些通信端口。但是,当我退出程序时,永远不会调用终结器。这是为什么?难道我做错了什么?
我正在手动调用 dispose,它会通过并关闭所有通信。这也没有被解雇。
这是我正在使用的终结器:
~Power()
{
Dispose(false);
}
终结器(这是您在此处使用的)仅在终结阶段调用,这将在 GC 期间发生。
如果您正确实现 IDisposable,则永远不应调用它。我在 IDisposable 上的系列中详细介绍了这一点。
话虽如此,如果您的“通信端口”是通过托管类处理的,则根本不应该使用终结器。这增加了对您没有任何帮助的开销。只需(正确地)实现 IDisposable,并让端口类周围的托管包装器在需要时处理终结。
如果一棵树倒在森林里,周围没有人听到,它会发出声音吗?确保这样做:
using System;
class Program {
static void Main(string[] args) {
new Test();
}
}
class Test {
~Test() { Console.Beep(); }
}
程序终止时留下的任何对象的终结器在进程终止之前被调用。唯一不会发生这种情况的方法是当进程被粗暴地中止时。例如 Environment.FailFast()。
终结器由垃圾收集器调用,垃圾收集不是一个可预测的过程,因此它不是很可靠。您需要找出其他方式来处置您的资源。