私はクラスの "Dispose"がすべてのイベントをアンフックし、オブジェクトを参照するタイマーを処分することを確認するユニットテストを書いています。WeakReference.IsLive()がfalseになる前に完全なガベージコレクションの後に遅延がありますか?
WeakReference.IsLive()は、falseを返すと予想されるときにtrueを返します。
WeakReference.IsLive()が更新される前に完全なGCの後に遅延がありますか?
もしそうでなければ、私には繰り返し得られない結果を与えてくれる何かを考えてもらえますか?
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
関連するが別の質問のためにもTesting Finalizers and IDisposable参照してください。
How can I write a unit test to determine whether an object can be garbage collected?は、GC.WaitForPendingFinalizers()を呼び出すことを含む解決策を持っていますが、GC.WaitForPendingFinalizers()を呼び出すのではなく、ディスパッチの仕組みを証明したいので、ファイナライザを実行する必要はありません。
WaitForPendingFinalizersを呼び出そうとしましたか? – Henrik
@Henrik、いいえ、私たちが待っているファイナライザを持っていないので、 –