0

当我的 DLL 由我不控制的代码托管时,以下伪代码是否实现了我自己清理的目标?

  • 更具体地说,如何清理在静态构造函数中创建的对象?

  • 我需要在 Disposable 中抑制 Finalize 吗?

  • 即使主机没有,我是否保证编译器或其他东西会调用 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()如果您的类有终结器(您的似乎没有,因为它已被注释掉),或者如果有人可以从您的类派生并且可能引入可能需要清理的非托管资源,则您需要在您的方法中禁止终结。后者在这里适用,因为你的类没有被标记sealed,所以你应该禁止 finalize in Dispose()

运行时不会调用Dispose(),但是如果存在,它将调用终结器。但是请注意,由于您的类实例似乎没有使用任何非托管资源,因此不需要终结器。

于 2012-06-22T01:04:32.730 回答