Я написал модульный тест, чтобы подтвердить, что «Dispose» в моем классе отключает все события и располагает таймером, который ссылается на объект.
Однако иногда WeakReference.IsLive () возвращает true, когда я ожидаю, что он вернет false?
Так есть ли задержка после полного GC перед WeakReference.IsLive () обновляется?
Если нет, можете ли вы вспомнить что-нибудь еще, что дало бы мне неповторимые результаты?
WeakReference weekJobWatchDog = new WeakReference(jobWatchDog);
jobWatchDog = null;
// not collected before Dispose called due to timer and events etc
GC.Collect(); GC.Collect();
Assert.IsTrue(weekJobWatchDog.IsAlive);
((IDisposable)weekJobWatchDog.Target).Dispose();
// is now collected as Dispose unlocked all events and dispoed the timer
GC.Collect(); GC.Collect();
Assert.IsFalse(weekJobWatchDog.IsAlive); // sometimes this fails, about 1 in 4 runs
См. также Тестирование финализаторов и IDisposable для связанного, но другого вопроса.
Как я могу написать модульный тест, чтобы определить, может ли объект быть собранным мусором? имеет решение, которое включает вызов GC.WaitForPendingFinalizers (), однакоЯ предпочитаю не вызывать GC.WaitForPendingFinalizers (), поскольку я хочу доказать, что моя утилизация работает, и если она сработает, запускать финализаторы не нужно.