题
什么是正确的方式执行一些静态finallization?
有没有静态析构函数。的 AppDomain.DomainUnload
事件是不中提出的默认的领域。的 AppDomain.ProcessExit
事件股的总时间三秒钟(默认设置)之间的所有事件处理程序,所以它不是真的可以使用的。
解决方案
基本上,你不能。尽可能全面地设计你的方式。
不要忘记一个程序总是突然终止 - 有人拔出电源就是明显的例子。所以你所做的一切都必须是“尽力而为”。 - 在这种情况下,我当然希望 AppDomain.ProcessExit
就足够了。
在您的具体情况下,您需要做什么?
其他提示
Herfried Wagner撰写了一篇优秀文章,解释了如何实现这一目标&#8211 ;唉,用德语(和VB)。但是,代码应该是可以理解的。
我试过了:
static readonly Finalizer finalizer = new Finalizer();
sealed class Finalizer {
~Finalizer() {
Thread.Sleep(1000);
Console.WriteLine("one");
Thread.Sleep(1000);
Console.WriteLine("two");
Thread.Sleep(1000);
Console.WriteLine("three");
Thread.Sleep(1000);
Console.WriteLine("four");
Thread.Sleep(1000);
Console.WriteLine("five");
}
}
它似乎与 AppDomain.ProcessExit
事件完全相同:终结器获得ca.三秒钟......
我会质疑你在需要发布的静态方法中加载了什么。我当然不建议用静态方法做这些事情。
那就是说,你的静态方法可以实现一个具有finalize方法的对象。
两个解决方案,妄想到:
- 不要使用一个静态的类。如果使用非静态的类和化它,你不必担心清理一样多。
- 如果这不是一个选项,我认为这是一个良好的情况下使用单独.这将化复制的对象,有的终结吁请退出,但仍然允许你对待它就像一个静态的类的大部分。毕竟,你的课上是静态的,因此股票最常见的原因,不要使用单独.
以迈克尔·达马托夫的回答(C#)为基础,该回答基于Herfried K. Wagner。 (VB.NET)这里是C ++ / CLI版本:
ref class MyClass
{
ref class StaticFinalizer sealed
{
!StaticFinalizer();
};
static initonly StaticFinalizer^ stDestr = gcnew StaticFinalizer();
}
MyClass::StaticFinalizer::!StaticFinalizer()
{
System::Diagnostics::Debug::WriteLine("In StaticFinalizer!");
}
P.S。就像AppDomain.ProcessExit方法一样,如果进程异常终止(例如,从任务管理器),则可能不会调用此方法。 另一个值得注意的是,如果MyClass是通用的(模板化的),那么每个应用程序执行时静态构造函数和静态析构函数将被调用不超过一次的假设不再有效。
不隶属于 StackOverflow