41

我有一个包含大量静态成员的类,其中一些保留对托管和非托管对象的引用。

例如,只要引用了 Type,就会调用静态构造函数,这会导致我的类启动任务的阻塞队列。例如,当调用其中一种静态方法时,就会发生这种情况。

我实现了 IDisposable,它为我提供了处理我创建的任何实例对象的处置的方法。但是,如果使用者没有从我的类创建任何实例对象,则永远不会调用这些方法。

我如何以及在哪里放置代码来处理由我的类的静态部分维护的引用?我一直认为静态引用资源的处理是在最后一个实例对象被释放的时候发生的;这是我第一次创建一个不能创建实例的类。

4

4 回答 4

59

在卸载托管您的类的应用程序域之前,您的类的静态变量不会被垃圾收集。该Dispose()方法不会被调用,因为它是一个实例方法,并且您说过您不会创建您的类的任何实例。

如果您想使用该Dispose()方法,请将您的对象设置为单例,创建它的一个实例,并在您的应用程序即将退出时显式处理它。

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 回答
9
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
    }
}
于 2017-11-09T10:25:08.710 回答
0

您应该手动处理这些对象,无法为静态资源创建“终结器”。

于 2012-08-25T23:55:33.257 回答
-1

如果您真的想要保留对非托管对象的引用的静态成员,只需创建一个用于处理非托管对象的方法并“强制”消费者在退出时使用它。

我所说的“强制”是指用一段说明“何时”和“为什么”使用此“处置”方法的段落来记录您的课程。如果您是唯一的消费者(或您的代码......)或者您计划分发您的课程,请执行此操作。还尝试使用某种描述性名称(对于“dispose”方法),例如“DisposeStatics”、“AlwaysDispose”、“DisposeAtEnd”等。

于 2019-05-23T21:47:05.683 回答