编辑 - 根据答案重命名为终结器
我试图在终结器中做一些事情,但程序在我完成之前终止。为了模拟,我做了以下测试,最多打印 20
这是否意味着 .NET 终结器在 2 秒后“超时”?
~MyClass()
{
// do some cleaup
int i = 0;
while (true)
{
Console.WriteLine(i++);
Thread.Sleep(100);
}
}
Run Code Online (Sandbox Code Playgroud)
对于上下文,我有一些后台线程(任务对象),我想优雅地终止它们。我只是测试一下从终结器完成它需要多长时间。
有什么更好的设计模式可以做到这一点?也许有一个“关闭”方法,我必须确保在关闭表单时调用该方法?我知道终结器是为了清理非托管内存,但停止所有线程似乎很好,因为我知道它将被调用。
也许我只是让线程突然终止而不用担心?
首先,我应该注意到“析构函数”现在更常被称为“终结器”,因为前一个术语意味着这些特殊方法像 C++ 中的析构函数一样工作,但实际上并非如此。因此,如果您使用较新的术语,搜索的运气可能会更好。
对于你的问题,是的,有证据表明 .NET 在关闭期间对终结器有时间限制- 常见的说法是一个终结器花费超过 2 秒,或所有终结器花费 40 秒 - 将导致运行时放弃并直接关闭而无需继续让终结器运行。
我建议考虑实现 IDisposable 来确定性地处理清理。C# 具有语法糖(using语句),可以帮助消费者更轻松地完成此操作。
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |