diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Documents/ContentCallbackRegistry.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Documents/ContentCallbackRegistry.cs index dcc4813b5a9..7ca129ebb28 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Documents/ContentCallbackRegistry.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Documents/ContentCallbackRegistry.cs @@ -31,7 +31,7 @@ namespace MonoDevelop.Ide.Gui.Documents { - class ContentCallbackRegistry + class ContentCallbackRegistry : IDisposable { List contentCallbacks; Func contentGetter; @@ -157,5 +157,12 @@ void InvokeCallback (object content, ContentCallback callback) } } } + + public void Dispose () + { + // contentCallbacks do not need to be disposed atm, because the dispose only removes them from contentCallbacks + contentCallbacks = null; + contentGetter = null; + } } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs index 72fc681f2f2..bf546eadbf7 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/Document.cs @@ -121,6 +121,8 @@ void OnContentChanged () { var taskSource = new TaskCompletionSource (); var regCancel = cancellationToken.Register (() => taskSource.TrySetCanceled ()); + disposeTokenSource?.Token.Register (() => taskSource.TrySetCanceled ()); + var regContent = RunWhenContentAdded (c => { taskSource.TrySetResult (c); }); @@ -637,9 +639,14 @@ void Window_CloseRequested (object sender, EventArgs e) Close ().Ignore (); } + CancellationTokenSource disposeTokenSource = new CancellationTokenSource (); + void Dispose () { DocumentRegistry.Remove (this); + disposeTokenSource?.Cancel (); + disposeTokenSource?.Dispose (); + disposeTokenSource = null; callbackRegistration?.Dispose (); var workspace = Runtime.PeekService (); if (workspace != null) @@ -655,7 +662,10 @@ void Dispose () window.CloseRequested -= Window_CloseRequested; window = null; + contentCallbackRegistry?.Dispose (); contentCallbackRegistry = null; + + contentActiveViewCallbackRegistry?.Dispose (); contentActiveViewCallbackRegistry = null; } #region document tasks