2012-06-22 2 views
0

Выполняет ли следующий код psuedo мою цель очистки после себя, когда моя DLL размещается кодом, который я не контролирую?Чистое закрытие статических событий DLL в хосте Я не управляю

  • В частности, как очистить объекты, созданные в моем статическом конструкторе?

  • Нужно ли подавлять завершение в одноразовых?

  • Я уверен, что компилятор или что-то вызовет 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? 
    //} 
} 

ответ

1

Отвечая на ваши вопросы в порядке: есть

Статические поля для жизни приложения, как таковые, они являются «очищены» в результате выход приложения (память восстановлена, файлы закрыты и т. д.). Кажется, вы не делаете ничего, что может потребовать явного действия для очистки (например, сброса буферизованных данных в StreamWriter в файл), но, возможно, в вашем фрагменте кода отсутствуют детали.

Необходимо, чтобы ваш метод Dispose() был завершен, если у вашего класса есть финализатор (кажется, что ваш класс не закомментирован), или если кто-то может получить ваш класс и может ввести неуправляемые ресурсы, которые могут потребоваться очистка. Последнее применяется здесь, так как ваш класс не отмечен sealed, поэтому вы должны подавить финализировать в Dispose().

Время выполнения не будет звонить Dispose(), однако он будет вызывать финализатор, если он присутствует. Обратите внимание, однако, что, поскольку экземпляры класса, похоже, не используют неуправляемые ресурсы, финализатор не требуется.

+0

Так что, если мой хост DLL не вызовет Dispose, и если CLR тоже не будет, это означает, что события, которые мой конструктор никогда не будет очищен, если я не поместил очищающий код в деконструктор. Просто я понял, что «~» - финализатор? Я не хочу создавать утечку памяти. – LamonteCristo

+0

Да, файл MyDll() - это финализатор, однако помните, что больше нет ссылок на ваш класс, он будет очищен GC и в качестве подписки на события не является статичным, он тоже исчезнет, ​​без необходимости явно запрещать подписку. – Iridium

+0

Спасибо, так как мой таймер статичен, я должен там чистить? Если я догадываюсь, что у меня нет * have *, и GC это сделает, я думаю, что финализатор предназначен только для неуправляемого кода. – LamonteCristo