0

次の疑似コードは、DLL が私が制御していないコードによってホストされているときに、自分でクリーンアップするという私の目標を達成しますか?

  • より具体的には、静的コンストラクターで作成されたオブジェクトをクリーンアップするにはどうすればよいですか?

  • ディスポーザブルでファイナライズを抑制する必要がありますか?

  • ホストが呼び出さなくても、コンパイラまたは何かが IDisposable を呼び出すことが保証されていますか?

疑似コード:

public class MyDLL  : SomeHostICantControl, IDisposable
{
    public SpinLock MyDictionarySpinlock = new Spinlock; // approximate syntax
    public static Dictionary<string, string> MyDictionary = null;
    public static Timer MyCleanUpTimer = null;

    public static MyDLL()
    {
        // Set up Cache Here ... how do I dispose of it?
        MyDictionary = new Dictionary<string, string>();

       // remove old data from the dictionary, use spinlock to sync writes
       // or use concurrent dictionary in .NET 4
       MyCleanUpTimer = new Timer(); // run every hour
    }

    // many instances will be created and disposed of.  I have no control when or how often
    public void MyDll()
    {
       this.MyHostEvent += New Event Handler....
    }

    //.. some event handler code here


    public void Dispose()
    {
       this.MyHostEvent -= Event Handler.;
       // Do I need to suppressFinalize here?
    }

    //~MyDll()
   //{
   // Is this the right place to clean up after my constuctor?
   //}
}
4

1 に答える 1

1

順番に質問に答える:

静的フィールドは、アプリケーションの存続期間中存在します。そのため、静的フィールドは、アプリケーションの終了(メモリの再利用、ファイルのクローズなど)の結果として「クリーンアップ」されます。クリーンアップするために明示的なアクションを実行する必要がある可能性のあることは何もしていないようです(たとえば、StreamWriter内のバッファリングされたデータをファイルにフラッシュする)が、コードスニペットに詳細が欠落している可能性があります。

Dispose()クラスにファイナライザーがある場合(コメントアウトされているように見えない場合)、または誰かがクラスから派生して、クリーンアップが必要な管理されていないリソースを導入する可能性がある場合は、メソッドでfinalizeを抑制する必要があります。クラスがマークされていないため、後者がここに適用されます。sealedしたがって、でfinalizeを抑制する必要がありDispose()ます。

ランタイムは呼び出しませんがDispose()、ファイナライザーが存在する場合は呼び出します。ただし、クラスインスタンスは管理されていないリソースを使用していないように見えるため、ファイナライザーは必要ありません。

于 2012-06-22T01:04:32.730 に答える