Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit 1ea222a

Browse files
committed
Lazy load VSGitExt on Main thread
Make PullRequestStatusBarPackage load on background thread. The VSGitExt MEF service must be loaded on the Main thread.
1 parent 97eaced commit 1ea222a

File tree

3 files changed

+17
-20
lines changed

3 files changed

+17
-20
lines changed

src/GitHub.InlineReviews/PullRequestStatusBarPackage.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Windows;
32
using System.Threading;
43
using System.Runtime.InteropServices;
54
using Microsoft.VisualStudio.Shell;
@@ -10,9 +9,9 @@
109

1110
namespace GitHub.InlineReviews
1211
{
13-
[PackageRegistration(UseManagedResourcesOnly = true)]
1412
[Guid(Guids.PullRequestStatusPackageId)]
15-
[ProvideAutoLoad(Guids.GitSccProviderId)]
13+
[PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
14+
[ProvideAutoLoad(Guids.GitSccProviderId, PackageAutoLoadFlags.BackgroundLoad)]
1615
public class PullRequestStatusBarPackage : AsyncPackage
1716
{
1817
/// <summary>
@@ -23,7 +22,7 @@ protected override async Task InitializeAsync(CancellationToken cancellationToke
2322
var componentModel = (IComponentModel)await GetServiceAsync(typeof(SComponentModel));
2423
var exportProvider = componentModel.DefaultExportProvider;
2524
var pullRequestStatusManager = exportProvider.GetExportedValue<IPullRequestStatusBarManager>();
26-
pullRequestStatusManager.Initialize(Application.Current.MainWindow);
25+
await pullRequestStatusManager.InitializeAsync();
2726
}
2827
}
2928
}
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Windows;
1+
using System.Threading.Tasks;
22

33
namespace GitHub.InlineReviews.Services
44
{
@@ -7,7 +7,6 @@ public interface IPullRequestStatusBarManager
77
/// <summary>
88
/// Place the PR status control on Visual Studio's status bar.
99
/// </summary>
10-
/// <param name="mainWindow">The main window of Visual Studio.</param>
11-
void Initialize(Window mainWindow);
10+
Task InitializeAsync();
1211
}
1312
}

src/GitHub.InlineReviews/Services/PullRequestStatusBarManager.cs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,13 @@ public class PullRequestStatusBarManager : IPullRequestStatusBarManager
2424
static readonly ILogger log = LogManager.ForContext<PullRequestStatusBarManager>();
2525
const string StatusBarPartName = "PART_SccStatusBarHost";
2626

27-
readonly IVSGitExt gitExt;
27+
readonly Lazy<IVSGitExt> gitExt;
2828
readonly Lazy<IPullRequestSessionManager> pullRequestSessionManager;
2929
readonly IUsageTracker usageTracker;
3030
readonly IGitHubServiceProvider serviceProvider;
3131

32-
Window mainWindow;
33-
3432
[ImportingConstructor]
35-
public PullRequestStatusBarManager(IVSGitExt gitExt, Lazy<IPullRequestSessionManager> pullRequestSessionManager,
33+
public PullRequestStatusBarManager(Lazy<IVSGitExt> gitExt, Lazy<IPullRequestSessionManager> pullRequestSessionManager,
3634
IUsageTracker usageTracker, IGitHubServiceProvider serviceProvider)
3735
{
3836
this.gitExt = gitExt;
@@ -45,23 +43,24 @@ public PullRequestStatusBarManager(IVSGitExt gitExt, Lazy<IPullRequestSessionMan
4543
/// Lazily initialize when user enters the context of a GitHub repository.
4644
/// </summary>
4745
/// <param name="window">Visual Studio's main window.</param>
48-
public void Initialize(Window window)
46+
public async Task InitializeAsync()
4947
{
50-
mainWindow = window;
48+
await ThreadingHelper.SwitchToMainThreadAsync();
49+
5150
OnActiveRepositoriesChanged();
52-
gitExt.ActiveRepositoriesChanged += OnActiveRepositoriesChanged;
51+
gitExt.Value.ActiveRepositoriesChanged += OnActiveRepositoriesChanged;
5352
}
5453

5554
void OnActiveRepositoriesChanged()
5655
{
57-
if (gitExt.ActiveRepositories.Count > 0)
56+
if (gitExt.Value.ActiveRepositories.Count > 0)
5857
{
59-
InitializeAsync().Forget();
60-
gitExt.ActiveRepositoriesChanged -= OnActiveRepositoriesChanged;
58+
StartShowingStatus().Forget();
59+
gitExt.Value.ActiveRepositoriesChanged -= OnActiveRepositoriesChanged;
6160
}
6261
}
6362

64-
async Task InitializeAsync()
63+
async Task StartShowingStatus()
6564
{
6665
try
6766
{
@@ -103,7 +102,7 @@ PullRequestStatusViewModel CreatePullRequestStatusViewModel(IPullRequestModel pu
103102

104103
void ShowStatus(PullRequestStatusViewModel pullRequestStatusViewModel = null)
105104
{
106-
var statusBar = FindSccStatusBar();
105+
var statusBar = FindSccStatusBar(Application.Current.MainWindow);
107106
if (statusBar != null)
108107
{
109108
var githubStatusBar = Find<PullRequestStatusView>(statusBar);
@@ -134,7 +133,7 @@ static T Find<T>(StatusBar statusBar)
134133
return default(T);
135134
}
136135

137-
StatusBar FindSccStatusBar()
136+
StatusBar FindSccStatusBar(Window mainWindow)
138137
{
139138
var contentControl = mainWindow?.Template?.FindName(StatusBarPartName, mainWindow) as ContentControl;
140139
return contentControl?.Content as StatusBar;

0 commit comments

Comments
 (0)