.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
语句 - 有助于让消费者更容易做到这一点。
编辑 - 每个答案重命名为终结器
我想在终结器中做一些事情,但程序在我完成之前就终止了。为了模拟,我进行了以下测试,最多打印 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
语句 - 有助于让消费者更容易做到这一点。