Ich habe einen Komponententest geschrieben, um zu bestätigen, dass das "Dispose" in meiner Klasse alle Ereignisse aushängt und einen Timer gibt, der auf das Objekt verweist.Gibt es eine Verzögerung nach einer vollständigen Speicherbereinigung, bevor WeakReference.IsLive() false wird?
Jedoch manchmal WeakReference.IsLive() gibt True zurück, wenn ich erwarten würde, dass es false zurückgibt?
Gibt es eine Verzögerung nach einem vollständigen GC bevor WeakReference.IsLive() aktualisiert wird?
Wenn nicht, können Sie an etwas anderes denken, das mir unwiederholbare Ergebnisse geben würde?
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
Siehe auch Testing Finalizers and IDisposable für eine verwandte, aber andere Frage.
How can I write a unit test to determine whether an object can be garbage collected? hat eine soltuion die GC.WaitForPendingFinalizers(), aber ich lieber nicht nennen GC.WaitForPendingFinalizers(), wie ich will beweisen, dass meine dispose Werke und wenn es funktionierte es wird keine Notwendigkeit für irgendwelche Finalizers umfasst Aufruf ausführen .
Haben Sie versucht, WaitForPendingFinalizers aufzurufen? – Henrik
@Henrik, nein, da wir keine Finalizer haben wollen wir auf –