未验证 提交 611578d7 编写于 作者: S Sam Harwell 提交者: GitHub

Merge pull request #36161 from sharwell/updaterefs-no-capture

Avoid in-process captures in UpdateReferencesAync
......@@ -205,8 +205,8 @@ private async Task UpdateSymbolTreeInfoAsync(Project project, CancellationToken
// Produce the indices for the source and metadata symbols in parallel.
var tasks = new List<Task>
{
GetTask(project, () => UpdateSourceSymbolTreeInfoAsync(project, cancellationToken), cancellationToken),
GetTask(project, () => UpdateReferencesAync(project, cancellationToken), cancellationToken)
GetTask(project, (self, project, _, cancellationToken) => self.UpdateSourceSymbolTreeInfoAsync(project, cancellationToken), null, cancellationToken),
GetTask(project, (self, project, _, cancellationToken) => self.UpdateReferencesAync(project, cancellationToken), null, cancellationToken)
};
await Task.WhenAll(tasks).ConfigureAwait(false);
......@@ -230,14 +230,21 @@ private async Task UpdateSourceSymbolTreeInfoAsync(Project project, Cancellation
}
}
private Task GetTask(Project project, Func<Task> func, CancellationToken cancellationToken)
[PerformanceSensitive("https://github.com/dotnet/roslyn/issues/36158", AllowCaptures = false, Constraint = "Avoid captures to reduce GC pressure when running in the host workspace.")]
private Task GetTask(Project project, Func<IncrementalAnalyzer, Project, PortableExecutableReference, CancellationToken, Task> func, PortableExecutableReference reference, CancellationToken cancellationToken)
{
var isRemoteWorkspace = project.Solution.Workspace.Kind == WorkspaceKind.RemoteWorkspace;
return isRemoteWorkspace
? Task.Run(func, cancellationToken)
: func();
? GetNewTask(this, func, project, reference, cancellationToken)
: func(this, project, reference, cancellationToken);
static Task GetNewTask(IncrementalAnalyzer self, Func<IncrementalAnalyzer, Project, PortableExecutableReference, CancellationToken, Task> func, Project project, PortableExecutableReference reference, CancellationToken cancellationToken)
{
return Task.Run(() => func(self, project, reference, cancellationToken), cancellationToken);
}
}
[PerformanceSensitive("https://github.com/dotnet/roslyn/issues/36158", AllowCaptures = false)]
private Task UpdateReferencesAync(Project project, CancellationToken cancellationToken)
{
// Process all metadata references. If it remote workspace, do this in parallel.
......@@ -246,7 +253,7 @@ private Task UpdateReferencesAync(Project project, CancellationToken cancellatio
foreach (var reference in project.MetadataReferences.OfType<PortableExecutableReference>())
{
tasks.Add(
GetTask(project, () => UpdateReferenceAsync(project, reference, cancellationToken), cancellationToken));
GetTask(project, (self, project, reference, cancellationToken) => self.UpdateReferenceAsync(project, reference, cancellationToken), reference, cancellationToken));
}
return Task.WhenAll(tasks);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册