提交 e91954ec 编写于 作者: R Ravi Chande

Asynchronously determine whether to refresh class view

When it seems a DocumentChanged workspace change, AbstractObjectBrowserLibraryManager gets the TextVersions of
the old and new documents synchronously on the UI thread. This was causing delays that showed up in peformance
telemetry. Instead, we should simply do this check (and refresh Class View by incrementing a number) in the
background.
上级 4ecbb2df
......@@ -4,6 +4,7 @@
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.VisualStudio.ComponentModelHost;
using Microsoft.VisualStudio.LanguageServices.Implementation.Library.ObjectBrowser.Lists;
......@@ -13,6 +14,7 @@
using Microsoft.VisualStudio.Shell.Interop;
using Roslyn.Utilities;
using IServiceProvider = System.IServiceProvider;
using Task = System.Threading.Tasks.Task;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.Library.ObjectBrowser
{
......@@ -28,6 +30,7 @@ internal abstract partial class AbstractObjectBrowserLibraryManager : AbstractLi
private ObjectListItem _activeListItem;
private AbstractListItemFactory _listItemFactory;
private object classMemberGate = new object();
protected AbstractObjectBrowserLibraryManager(string languageName, Guid libraryGuid, IServiceProvider serviceProvider)
: base(libraryGuid, serviceProvider)
......@@ -63,7 +66,7 @@ public void Dispose()
this.Workspace.WorkspaceChanged -= OnWorkspaceChanged;
}
private void OnWorkspaceChanged(object sender, WorkspaceChangeEventArgs e)
private async void OnWorkspaceChanged(object sender, WorkspaceChangeEventArgs e)
{
switch (e.Kind)
{
......@@ -73,15 +76,7 @@ private void OnWorkspaceChanged(object sender, WorkspaceChangeEventArgs e)
var oldDocument = e.OldSolution.GetDocument(e.DocumentId);
var newDocument = e.NewSolution.GetDocument(e.DocumentId);
var oldTextVersion = oldDocument.GetTextVersionAsync(CancellationToken.None).WaitAndGetResult(CancellationToken.None);
var newTextVersion = newDocument.GetTextVersionAsync(CancellationToken.None).WaitAndGetResult(CancellationToken.None);
if (oldTextVersion != newTextVersion)
{
UpdateClassVersion();
UpdateMembersVersion();
}
await DocumentChangedAsync(oldDocument, newDocument).ConfigureAwait(false);
break;
case WorkspaceChangeKind.ProjectAdded:
......@@ -101,14 +96,37 @@ private void OnWorkspaceChanged(object sender, WorkspaceChangeEventArgs e)
}
}
private async Task DocumentChangedAsync(Document oldDocument, Document newDocument)
{
var oldTextVersion = await oldDocument.GetTextVersionAsync(CancellationToken.None).ConfigureAwait(false);
var newTextVersion = await newDocument.GetTextVersionAsync(CancellationToken.None).ConfigureAwait(false);
if (oldTextVersion != newTextVersion)
{
UpdateClassAndMemberVersions();
}
}
internal uint ClassVersion
{
get { return _classVersion; }
get
{
lock (classMemberGate)
{
return _classVersion;
}
}
}
internal uint MembersVersion
{
get { return _membersVersion; }
get
{
lock (classMemberGate)
{
return _membersVersion;
}
}
}
internal uint PackageVersion
......@@ -116,12 +134,21 @@ internal uint PackageVersion
get { return _packageVersion; }
}
internal void UpdateClassVersion()
internal void UpdateClassAndMemberVersions()
{
lock (classMemberGate)
{
UpdateClassVersion();
UpdateMembersVersion();
}
}
private void UpdateClassVersion()
{
_classVersion = unchecked(_classVersion + 1);
}
internal void UpdateMembersVersion()
private void UpdateMembersVersion()
{
_membersVersion = unchecked(_membersVersion + 1);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册