From 1aafa02c4c3cc3fe4a7e3e5fa00f41052dcb3fdc Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 14 Jun 2011 16:53:06 +0200 Subject: [PATCH] Fix SD-1767 - NullReferenceException when closing a solution while "Loading References..." is active. --- .../Base/Project/Src/Project/MSBuildBasedProject.cs | 3 +++ .../Services/ParserService/ParseProjectContent.cs | 13 ++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs index 8c2871c3ac..ef1b5c3d1e 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs @@ -407,6 +407,9 @@ namespace ICSharpCode.SharpDevelop.Project try { System.Threading.Monitor.Enter(this.SyncRoot, ref lockTaken); + if (projectFile == null) + throw new ObjectDisposedException("MSBuildBasedProject"); + if (configuration == null) configuration = this.ActiveConfiguration; if (platform == null) diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs index 1364563ca2..1134303ae3 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs @@ -66,7 +66,7 @@ namespace ICSharpCode.SharpDevelop if (reference != null) { // TODO: Translate me // progressMonitor.TaskName = "Loading " + reference.ShortName + "..."; - AddReference(reference, false); + AddReference(reference, false, progressMonitor.CancellationToken); } } } @@ -109,7 +109,7 @@ namespace ICSharpCode.SharpDevelop } } - void AddReference(ReferenceProjectItem reference, bool updateInterDependencies) + void AddReference(ReferenceProjectItem reference, bool updateInterDependencies, CancellationToken cancellationToken) { try { AddReferencedContent(AssemblyParserService.GetProjectContentForReference(reference)); @@ -122,6 +122,13 @@ namespace ICSharpCode.SharpDevelop // If the user removes the reference and then re-adds it, there might be other references // in the project depending on it, so we do the refresh after the old reference was added. AssemblyParserService.RefreshProjectContentForReference(reference); + } catch (OperationCanceledException) { + throw; + } catch (ObjectDisposedException e) { + // ObjectDisposedException can happen if project gets disposed while LoadSolutionProjectsThread is running. + // We will ignore the ObjectDisposedException and throw OperationCanceledException instead. + cancellationToken.ThrowIfCancellationRequested(); + MessageService.ShowException(e); } catch (Exception e) { MessageService.ShowException(e); } @@ -268,7 +275,7 @@ namespace ICSharpCode.SharpDevelop double fileCountInverse = 1.0 / fileContents.Count; Parallel.ForEach( fileContents, - new ParallelOptions { + new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 2, CancellationToken = progressMonitor.CancellationToken },