执行某些静态finallization的正确方法是什么?
没有静态析构函数.AppDomain.DomainUnload
默认域中不会引发该事件.该AppDomain.ProcessExit
事件共享所有事件处理程序之间的三秒(默认设置)的总时间,因此它实际上不可用.
Herfried Wagner撰写了一篇很好的文章,解释了如何实现这一点 - 唉,德语(和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. 三秒......
基本上,你不能.尽可能地围绕它进行设计.
不要忘记一个程序总是可以突然终止 - 有人拔出电源就是明显的例子.因此,你所做的任何事情都必须是"尽力而为" - 在这种情况下,我当然希望这样AppDomain.ProcessExit
做足够好.
在您的具体情况下,您需要做什么?
跳起来的两个解决方案:
不要使用静态类.如果您使用非静态类并实例化它,则不必担心清理.
如果这不是一个选项,我认为这是一个使用单身人士的好情况.这将实例化您的对象的副本并在退出时调用终结器,但仍允许您将其视为静态类.毕竟,你的类已经是静态的,因此分享了大多数不使用单例的常见原因.
我会质疑你在需要释放的静态方法中加载了什么.我当然不建议用静态方法做这些事情.
也就是说,您的静态方法可以实现具有finalize方法的对象.