45

いくつかの静的ファイナライズを実行する正しい方法は何ですか?

静的デストラクタはありません。イベントはAppDomain.DomainUnloadデフォルト ドメインでは発生しません。イベントは、すべてのAppDomain.ProcessExitイベント ハンドラー間で合計 3 秒 (既定の設定) の時間を共有するため、実際には使用できません。

4

5 に答える 5

49

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 を取得します。三秒…

于 2008-11-01T23:51:57.930 に答える
32

基本的に、できません。可能な限り最大限に回避するように設計してください。

いずれにせよ、プログラムはいつでも突然終了する可能性があることを忘れないでください。誰かが電源を抜いたことが明らかな例です。したがって、何をするにも「ベスト エフォート」でなければなりません。その場合、それで十分であることを願っています。AppDomain.ProcessExit

あなたの特定のケースでは、何をする必要がありますか?

于 2008-11-01T20:40:44.807 に答える
8

頭に浮かぶ2つのソリューション:

  • 静的クラスを使用しないでください。非静的クラスを使用してインスタンス化する場合、クリーンアップについてそれほど心配する必要はありません。
  • それが選択肢ではない場合、これはシングルトンを使用するのに適した状況であると私は主張します。これにより、オブジェクトのコピーがインスタンス化され、終了時にファイナライザーが呼び出されますが、ほとんどの場合、それを静的クラスのように扱うことができます。結局のところ、クラスはすでに静的であるため、シングルトンを使用しない一般的な理由のほとんどを共有しています。
于 2008-11-01T20:59:25.393 に答える
6

リリースする必要がある静的メソッドに何をロードしているのか疑問に思います。これらのことを静的メソッドで行うことはお勧めしません。

つまり、静的メソッドは、ファイナライズ メソッドを持つオブジェクトをインスタンス化できます。

于 2008-11-01T20:40:51.407 に答える