private static bool IsTrackingContext(WeakReference<IGraphContext> weakContext) { var context = weakContext.GetTarget(); return context != null && !context.CancelToken.IsCancellationRequested; }
public void Test_MemoryLeak_WeakEvent() { // 1. Normal Event will hold the strong reference which prevent the GC collect. var view = new TestView(); var viewModel = new TestViewModel(); var reference = new WeakReference(view); viewModel.TestViewModelEvent += view.OnEventOccured; viewModel.RaiseTestViewModelEvent(); Assert.AreEqual(1, view.EventCount); Assert.AreEqual(1, viewModel.GetTestViewModelEventInvocationCount()); view = null; GC.Collect(); Assert.IsTrue(reference.IsAlive); // Still live viewModel.TestViewModelEvent -= reference.GetTarget<TestView>().OnEventOccured; GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); Assert.IsFalse(reference.IsAlive); reference = null; Assert.IsNull(reference.GetTarget<TestView>()); // 2. WeakEvent hold the weak reference which will not prevent GC collect. var view2 = new TestView(); var viewModel2 = new TestViewModel(); var reference2 = new WeakReference(view2); var weakEvent = new WeakEvent(view2); weakEvent.AttachEvent(viewModel2, null, "TestViewModelEvent", "OnEventOccured"); viewModel2.RaiseTestViewModelEvent(); Assert.AreEqual(1, view2.EventCount); view2 = null; GC.Collect(); Assert.IsFalse(reference2.IsAlive); viewModel2.RaiseTestViewModelEvent(); Assert.AreEqual(0, viewModel2.GetTestViewModelEventInvocationCount()); }