我有一个包含大量静态成员的类,其中一些会保留对托管和非托管对象的引用。
例如,一旦引用了Type,就会调用静态构造函数,这会导致我的类启动tasks的blockingQueue。例如,当调用其中一个静态方法时会发生这种情况。
我实现了IDisposable,它为我提供了处理我创建的任何实例对象的方法。但是,如果使用者不从我的类创建任何实例对象,则永远不会调用这些方法。
我如何以及在何处放置代码来处理由我的类的静态部分维护的引用?我一直认为在释放最后一个实例对象时会发生静态引用资源的处理;这是我第一次创建一个不会创建任何实例的类。
答案 0 :(得分:46)
在卸载托管您的类的应用程序域之前,不会对您的类的静态变量进行垃圾回收。不会调用Dispose()
方法,因为它是一个实例方法,并且您说您不会创建任何类的实例。
如果您想使用Dispose()
方法,请将对象设为单个,创建一个实例,并在应用程序即将退出时显式处理它。
public class MyClass : IDisposable {
public IList List1<int> {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;
}
}
}
答案 1 :(得分:0)
您应手动处理此对象,无法为静态资源创建“终结器”。
答案 2 :(得分:0)
public class Logger : IDisposable
{
private string _logDirectory = null;
private static Logger _instance = null;
private Logger() : this(ConfigurationManager.AppSettings["LogDirectory"])
{
AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit;
}
private Logger(string logDirectory)
{
}
public static Logger Instance
{
get
{
if (_instance == null)
_instance = new Logger();
return _instance;
}
}
private void CurrentDomain_ProcessExit(object sender, EventArgs e)
{
Dispose();
}
public void Dispose()
{
// Dispose unmanaged resources
}
}
答案 3 :(得分:-1)
如果您真的要有静态成员来保留对非托管对象的引用 只需创建一种处理非托管对象的方法,然后“强制”消费者在退出时使用它即可。
通过“强制”,我的意思是用一段说明您何时使用此“ dispose”方法的“何时”和“为什么”的文档。 如果您是唯一的使用者(或您的代码...),或者计划分发您的课程,请这样做。 还尝试使用某种描述性的名称(针对该“ dispose”方法),例如“ DisposeStatics”,“ AlwaysDispose”,“ DisposeAtEnd”等。