diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs index 05db51bee62..8bcb8b55fa8 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs @@ -93,6 +93,8 @@ DedicatedThreadScheduler GitScheduler { TaskFactory DedicatedOperationFactory { get { + if (rootRepository == null) + throw new ObjectDisposedException ("This object is disposed."); if (dedicatedOperationFactory == null) dedicatedOperationFactory = new TaskFactory (GitScheduler); return dedicatedOperationFactory; @@ -285,6 +287,7 @@ void ThawEvents () FileService.ThawEvents (); } + object repositoryDisposeLock = new object (); protected override void Dispose (bool disposing) { if (IsDisposed) @@ -296,20 +299,24 @@ protected override void Dispose (bool disposing) gitLock?.Dispose (); if (rootRepository != null) { DedicatedOperationFactory.StartNew (() => { - try { - rootRepository?.Dispose (); - } catch (Exception e) { - LoggingService.LogInternalError ("Disposing LibGit2Sharp.Repository failed", e); - } - if (cachedSubmodules != null) { - foreach (var submodule in cachedSubmodules) { - if (submodule?.Item2 != null) { - try { - submodule?.Item2.Dispose (); - } catch (Exception e) { - LoggingService.LogInternalError ("Disposing LibGit2Sharp.Repository failed", e); + lock (repositoryDisposeLock) { + try { + rootRepository?.Dispose (); + rootRepository = null; + } catch (Exception e) { + LoggingService.LogInternalError ("Disposing LibGit2Sharp.Repository failed", e); + } + if (cachedSubmodules != null) { + foreach (var submodule in cachedSubmodules) { + if (submodule?.Item2 != null) { + try { + submodule?.Item2.Dispose (); + } catch (Exception e) { + LoggingService.LogInternalError ("Disposing LibGit2Sharp.Repository failed", e); + } } } + cachedSubmodules = null; } } }).Wait (); @@ -322,8 +329,6 @@ protected override void Dispose (bool disposing) base.Dispose (disposing); watcher = null; - rootRepository = null; - cachedSubmodules = null; } public override string[] SupportedProtocols {