Я хотел бы добавить, что:
Вызов GC.Collect () (+ WaitForPendingFinalizers ()) является частью истории.
Как справедливо отмечено другими, GC.COllect () является недетерминированной коллекцией и остается на усмотрение самого GC (CLR).
Даже если вы добавите вызов WaitForPendingFinalizers, он может быть не детерминированным.
Возьмите код из этой msdn link и запустите код с итерацией цикла объекта как 1 или 2. Вы найдете, что означает недетерминированный (установите точку останова в деструкторе объекта).
Точно, деструктор не вызывается, когда было только 1 (или 2) задерживающихся объектов с помощью Wait .. (). [Требование цитирования.]
Если ваш код работает с неуправляемыми ресурсами (например, дескрипторы внешних файлов), вы должны реализовать деструкторы (или финализаторы).
Вот интересный пример:
Примечание : Если вы уже попробовали приведенный выше пример из MSDN, следующий код прояснит ситуацию.
class Program
{
static void Main(string[] args)
{
SomePublisher publisher = new SomePublisher();
for (int i = 0; i < 10; i++)
{
SomeSubscriber subscriber = new SomeSubscriber(publisher);
subscriber = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(SomeSubscriber.Count.ToString());
Console.ReadLine();
}
}
public class SomePublisher
{
public event EventHandler SomeEvent;
}
public class SomeSubscriber
{
public static int Count;
public SomeSubscriber(SomePublisher publisher)
{
publisher.SomeEvent += new EventHandler(publisher_SomeEvent);
}
~SomeSubscriber()
{
SomeSubscriber.Count++;
}
private void publisher_SomeEvent(object sender, EventArgs e)
{
// TODO: something
string stub = "";
}
}
Я предлагаю сначала проанализировать, каким может быть вывод, а затем выполнить, а затем прочитать причину ниже:
{Деструктор вызывается неявно только после завершения программы. }
Чтобы детерминистически очистить объект, нужно реализовать IDisposable и сделать явный вызов Dispose (). Это суть! :)