私のアプリケーションのライブラリでは、管理されていないリソースをグローバルに使用する必要があります。
これを容易にするために、ライブラリには次のものがあります。
IDisposable
ます。
Instance()
、クラスのメソッドで行われます。
MySingleton
オブジェクトを介してアクセスされるため、これは、必要なときにアンマネージリソースを確実に使用できるようにする論理的な方法のようです。
public class MySingleton : IDisposable
{
private static MySingleton instance;
public static MySingleton Instance
{
get
{
if (instance == null)
{
lock (typeof(MySingleton))
{
if (instance == null)
{
instance = new MySingleton();
// Acquire unmanaged resource here
}
}
}
return instance;
}
}
public void Dispose()
{
// Release unmanaged resource here
}
}
問題
- 上記のシングルトンを備えたライブラリは、複数のアプリケーションで使用されています。
- 管理されていないリソースが正しくクリーンアップされるようにするには、
MySingleton.Instance.Dispose()
各アプリケーション内で呼び出す必要があります(通常、これがすべての状況finally
で発生することを確認するためにブロック内で)。exception
- 別のアプリケーション(つまり、エントリポイント)が作成され、作成者が
Dispose
メソッドの呼び出しを忘れた場合、管理されていないリソースが適切にクリーンアップされない可能性があります。
これを行うためにクラスにデストラクタを追加しようとしましたMySingleton
が、アプリケーションの終了時にブレークポイントがヒットしていないようです。これは、GCが非決定的であり、静的オブジェクトのデストラクタが破棄される前にアプリケーションが終了しているためだと思いますが、よくわかりません。
これが確実に行われるようにクライアントアプリケーションが明示的に呼び出すことに依存せずに、このリソースが常にクリーンアップされるようにするための洗練された方法はありますDispose
か?