当前位置:  开发笔记 > 编程语言 > 正文

静态终结器

如何解决《静态终结器》经验,为你挑选了4个好方法。

执行某些静态finallization的正确方法是什么?

没有静态析构函数.AppDomain.DomainUnload默认域中不会引发该事件.该AppDomain.ProcessExit事件共享所有事件处理程序之间的三秒(默认设置)的总时间,因此它实际上不可用.



1> Michael Dama..:

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委托不允许你调试它(至少根据我的经验).

2> Jon Skeet..:

基本上,你不能.尽可能地围绕它进行设计.

不要忘记一个程序总是可以突然终止 - 有人拔出电源就是明显的例子.因此,你所做的任何事情都必须是"尽力而为" - 在这种情况下,我当然希望这样AppDomain.ProcessExit做足够好.

在您的具体情况下,您需要做什么?


@MasonWheeler:你通常在它自己的AppDomain中有一个插件,在这种情况下你可以订阅`AppDomain.DomainUnload`事件.(没有类似于"超出范围"的类这样的概念,因为类不在范围内.)

3> Jason Baker..:

跳起来的两个解决方案:

不要使用静态类.如果您使用非静态类并实例化它,则不必担心清理.

如果这不是一个选项,我认为这是一个使用单身人士的好情况.这将实例化您的对象的副本并在退出时调用终结器,但仍允许您将其视为静态类.毕竟,你的类已经是静态的,因此分享了大多数不使用单例的常见原因.



4> Ady..:

我会质疑你在需要释放的静态方法中加载了什么.我当然不建议用静态方法做这些事情.

也就是说,您的静态方法可以实现具有finalize方法的对象.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有