41

私は、大規模な静的メンバーを持つクラスを持っています。その一部は、マネージド オブジェクトとアンマネージド オブジェクトへの参照を保持しています。

たとえば、静的コンストラクターは、Type が参照されるとすぐに呼び出され、これにより、私のクラスは Task のブロッキング キューを起動します。これは、たとえば、静的メソッドの 1 つが呼び出されたときに発生します。

IDisposable を実装しました。これにより、作成したインスタンス オブジェクトの破棄を処理するメソッドが提供されます。ただし、消費者がクラスからインスタンス オブジェクトを作成しない場合、これらのメソッドは呼び出されません。

クラスの静的部分によって保持されている参照を破棄するコードをどこにどのように配置すればよいですか? 私は常に、静的参照リソースの破棄は、最後のインスタンス オブジェクトが解放されたときに発生すると考えていました。インスタンスを作成できないクラスを作成したのはこれが初めてです。

4

4 に答える 4

59

クラスの静的変数は、クラスをホストしているアプリ ドメインがアンロードされるまでガベージ コレクションされません。メソッドはDispose()インスタンス メソッドであり、クラスのインスタンスを作成しないと言ったため、呼び出されません。

メソッドを利用したい場合はDispose()、オブジェクトをシングルトンにし、そのインスタンスを 1 つ作成して、アプリケーションが終了しようとしているときに明示的に破棄します。

public class MyClass : IDisposable {
    public IList List1 {get; private set;}
    public IDictionary<string,string> Dict1 {get; private set;}
    public void Dispose() {
        // Do something here
    }
    public static MyClass Instance {get; private set;}
    static MyClass() {
        Instance = new MyClass();
    }
    public static void DisposeInstance() {
        if (Instance != null) {
            Instance.Dispose();
            Instance = null;
        }
    }
}
于 2012-08-25T23:57:46.380 に答える
0

このオブジェクトは手動で破棄する必要があります。静的リソースの「ファイナライザー」を作成する方法はありません。

于 2012-08-25T23:55:33.257 に答える