Skip to content

Commit c1d4759

Browse files
authored
Stack Trace Explorer: Cancel previous navigation on new navigation (#79069)
Partial fix for #59682
2 parents 90229b2 + 57fb2a1 commit c1d4759

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

src/Features/Core/Portable/StackTraceExplorer/StackTraceExplorerUtilities.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ internal static class StackTraceExplorerUtilities
4747
using var _ = PooledObjects.ArrayBuilder<Project>.GetInstance(out var candidateProjects);
4848
foreach (var project in solution.Projects)
4949
{
50+
cancellationToken.ThrowIfCancellationRequested();
51+
5052
if (!project.SupportsCompilation)
5153
{
5254
continue;
@@ -116,6 +118,8 @@ DefinitionItem GetDefinition(IMethodSymbol method)
116118

117119
foreach (var resolver in _resolvers)
118120
{
121+
cancellationToken.ThrowIfCancellationRequested();
122+
119123
var matchingMethod = await resolver.TryGetBestMatchAsync(project, type, methodNode, methodArguments, methodTypeArguments, cancellationToken).ConfigureAwait(false);
120124
if (matchingMethod is not null)
121125
{

src/VisualStudio/Core/Def/StackTraceExplorer/StackFrameViewModel.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
using Microsoft.CodeAnalysis.Navigation;
2121
using Microsoft.CodeAnalysis.PooledObjects;
2222
using Microsoft.CodeAnalysis.StackTraceExplorer;
23+
using Microsoft.CodeAnalysis.Threading;
2324
using Microsoft.VisualStudio.Text.Classification;
24-
using Roslyn.Utilities;
2525

2626
namespace Microsoft.VisualStudio.LanguageServices.StackTraceExplorer;
2727

@@ -44,12 +44,14 @@ internal sealed class StackFrameViewModel(
4444
private TextDocument? _cachedDocument;
4545
private int _cachedLineNumber;
4646

47+
private readonly CancellationSeries _navigationCancellation = new(threadingContext.DisposalToken);
48+
4749
public override bool ShowMouseOver => true;
4850

4951
public void NavigateToClass()
5052
{
51-
var cancellationToken = _threadingContext.DisposalToken;
52-
Task.Run(() => NavigateToClassAsync(cancellationToken), cancellationToken).ReportNonFatalErrorAsync();
53+
var cancellationToken = _navigationCancellation.CreateNext();
54+
_ = NavigateToClassAsync(cancellationToken).ReportNonFatalErrorUnlessCancelledAsync(cancellationToken);
5355
}
5456

5557
public async Task NavigateToClassAsync(CancellationToken cancellationToken)
@@ -77,8 +79,8 @@ await location.TryNavigateToAsync(
7779

7880
public void NavigateToSymbol()
7981
{
80-
var cancellationToken = _threadingContext.DisposalToken;
81-
Task.Run(() => NavigateToMethodAsync(cancellationToken), cancellationToken).ReportNonFatalErrorAsync();
82+
var cancellationToken = _navigationCancellation.CreateNext();
83+
_ = NavigateToMethodAsync(cancellationToken).ReportNonFatalErrorUnlessCancelledAsync(cancellationToken);
8284
}
8385

8486
public async Task NavigateToMethodAsync(CancellationToken cancellationToken)
@@ -95,8 +97,8 @@ public async Task NavigateToMethodAsync(CancellationToken cancellationToken)
9597

9698
public void NavigateToFile()
9799
{
98-
var cancellationToken = _threadingContext.DisposalToken;
99-
Task.Run(() => NavigateToFileAsync(cancellationToken), cancellationToken).ReportNonFatalErrorAsync();
100+
var cancellationToken = _navigationCancellation.CreateNext();
101+
_ = NavigateToFileAsync(cancellationToken).ReportNonFatalErrorUnlessCancelledAsync(cancellationToken);
100102
}
101103

102104
public async Task NavigateToFileAsync(CancellationToken cancellationToken)

0 commit comments

Comments
 (0)