我的应用程序中的库需要全局使用非托管资源。
为了促进这一点,图书馆有以下内容:
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
以确保发生这种情况?