diff --git a/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/LanguageServices/Workspace.cs b/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/LanguageServices/Workspace.cs index 10f68a3a7d4..d35b874a75d 100644 --- a/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/LanguageServices/Workspace.cs +++ b/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/LanguageServices/Workspace.cs @@ -166,8 +166,11 @@ public void ChainDisposal(IDisposable disposable) /// A task that completes when the update has been integrated. internal async Task OnWorkspaceUpdateAsync(IProjectVersionedValue update) { - Verify.NotDisposed(this); - + if (IsDisposed || IsDisposing) + { + return; + } + await InitializeAsync(_unloadCancellationToken); Assumes.True(_state is WorkspaceState.Uninitialized or WorkspaceState.Initialized); diff --git a/tests/Microsoft.VisualStudio.ProjectSystem.Managed.VS.UnitTests/ProjectSystem/VS/LanguageServices/WorkspaceTests.cs b/tests/Microsoft.VisualStudio.ProjectSystem.Managed.VS.UnitTests/ProjectSystem/VS/LanguageServices/WorkspaceTests.cs index 7fb1a421313..21db844cdfe 100644 --- a/tests/Microsoft.VisualStudio.ProjectSystem.Managed.VS.UnitTests/ProjectSystem/VS/LanguageServices/WorkspaceTests.cs +++ b/tests/Microsoft.VisualStudio.ProjectSystem.Managed.VS.UnitTests/ProjectSystem/VS/LanguageServices/WorkspaceTests.cs @@ -85,11 +85,21 @@ public async Task Dispose_TriggersObjectDisposedExceptionsOnPublicMembers() await Assert.ThrowsAsync(() => workspace.WriteAsync(w => Task.CompletedTask, CancellationToken.None)); await Assert.ThrowsAsync(() => workspace.WriteAsync(w => TaskResult.EmptyString, CancellationToken.None)); - await Assert.ThrowsAsync(() => workspace.OnWorkspaceUpdateAsync(null!)); + //await Assert.ThrowsAsync(() => workspace.OnWorkspaceUpdateAsync(null!)); Assert.Throws(() => workspace.ChainDisposal(null!)); } + [Fact] + public async Task Dispose_DoesNotTriggerObjectDisposedExceptionsOnUpdate() + { + var workspace = await CreateInstanceAsync(); + + await workspace.DisposeAsync(); + + await workspace.OnWorkspaceUpdateAsync(null!); + } + [Theory] [CombinatorialData] public async Task WriteAsync_ThrowsIfNullAction(bool isGeneric)