10

我在 C# 中有一个类,我想在处理我的类时正确关闭一些通信端口。但是,当我退出程序时,永远不会调用终结器。这是为什么?难道我做错了什么?

我正在手动调用 dispose,它会通过并关闭所有通信。这也没有被解雇。

这是我正在使用的终结器:

~Power()
{
    Dispose(false);
}
4

3 回答 3

11

终结器(这是您在此处使用的)仅在终结阶段调用,这将在 GC 期间发生。

如果您正确实现 IDisposable,则永远不应调用它。我在 IDisposable 上的系列中详细介绍了这一点。

话虽如此,如果您的“通信端口”是通过托管类处理的,则根本不应该使用终结器。这增加了对您没有任何帮助的开销。只需(正确地)实现 IDisposable,并让端口类周围的托管包装器在需要时处理终结。

于 2011-03-05T00:55:36.750 回答
7

如果一棵树倒在森林里,周围没有人听到,它会发出声音吗?确保这样做:

using System;

class Program {
    static void Main(string[] args) {
        new Test();
    }
}

class Test {
    ~Test() { Console.Beep(); }
}

程序终止时留下的任何对象的终结器在进程终止之前被调用。唯一不会发生这种情况的方法是当进程被粗暴地中止时。例如 Environment.FailFast()。

于 2011-03-05T01:26:51.183 回答
0

终结器由垃圾收集器调用,垃圾收集不是一个可预测的过程,因此它不是很可靠。您需要找出其他方式来处置您的资源。

于 2011-03-05T00:55:35.083 回答