Выполняет ли следующий код 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?
//}
}
Так что, если мой хост DLL не вызовет Dispose, и если CLR тоже не будет, это означает, что события, которые мой конструктор никогда не будет очищен, если я не поместил очищающий код в деконструктор. Просто я понял, что «~» - финализатор? Я не хочу создавать утечку памяти. – LamonteCristo
Да, файл MyDll() - это финализатор, однако помните, что больше нет ссылок на ваш класс, он будет очищен GC и в качестве подписки на события не является статичным, он тоже исчезнет, без необходимости явно запрещать подписку. – Iridium
Спасибо, так как мой таймер статичен, я должен там чистить? Если я догадываюсь, что у меня нет * have *, и GC это сделает, я думаю, что финализатор предназначен только для неуправляемого кода. – LamonteCristo