.NET 终结器是否有超时?

Do .NET finalizers have a timeout?

编辑 - 每个答案重命名为终结器

我想在终结器中做一些事情,但程序在我完成之前就终止了。为了模拟,我进行了以下测试,最多打印 20

这是否意味着 .NET 终结器在 2 秒后“超时”?

~MyClass()
{
    // do some cleaup
    int i = 0;
    while (true)
    {
        Console.WriteLine(i++);
        Thread.Sleep(100);
    }
}

对于上下文,我有一些我想正常终止的后台线程(任务对象)。我只是在测试从终结器执行它需要多长时间。

执行此操作的更好设计模式是什么?也许有一个“关闭”方法,我必须确保在关闭表单时调用它?我知道终结器用于清理非托管内存,但停止我的所有线程似乎很好,因为我知道它会被调用。

也许我只是让线程突然终止而不用担心?

首先,我应该注意到“析构函数”现在更常被称为“终结器”,因为前一个术语暗示这些特殊方法的工作方式类似于 C++ 中的析构函数,但实际上并非如此。因此,如果您使用较新的术语,搜索结果可能会更好。

对于你的问题,是的,there is evidence that .NET has a time limit on finalizers during shutdown - 常见的说法是一个终结器花费超过 2 秒,或者所有终结器花费 40 秒 - 将导致 运行time 放弃并关闭没有继续让终结者 运行.

我建议研究 implementing IDisposable to handle cleanup deterministically。 C# 具有语法糖 - using 语句 - 有助于让消费者更容易做到这一点。