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

Commit 48cb0cc

Browse files
committed
Allow MEF to refresh its cache on a background thread
1 parent ec46954 commit 48cb0cc

File tree

2 files changed

+32
-14
lines changed

2 files changed

+32
-14
lines changed

src/GitHub.VisualStudio/GitHubPackage.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ public async Task<IGitHubPaneViewModel> ShowGitHubPane()
136136
ErrorHandler.Failed(frame.Show());
137137
}
138138

139-
var viewModel = (IGitHubPaneViewModel)((FrameworkElement)pane.Content).DataContext;
139+
var gitHubPane = (GitHubPane)pane;
140+
var viewModel = (IGitHubPaneViewModel)((FrameworkElement)gitHubPane.View).DataContext;
140141
await viewModel.InitializeAsync(pane);
141142
return viewModel;
142143
}

src/GitHub.VisualStudio/UI/GitHubPane.cs

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,19 @@
44
using System.Reactive.Linq;
55
using System.Runtime.InteropServices;
66
using System.Windows;
7+
using System.Windows.Controls;
8+
using GitHub.Helpers;
79
using GitHub.Extensions;
810
using GitHub.Factories;
9-
using GitHub.Models;
1011
using GitHub.Services;
1112
using GitHub.ViewModels;
1213
using GitHub.ViewModels.GitHubPane;
1314
using Microsoft.VisualStudio.Shell;
1415
using Microsoft.VisualStudio.Shell.Interop;
16+
using Microsoft.VisualStudio.ComponentModelHost;
1517
using ReactiveUI;
18+
using Task = System.Threading.Tasks.Task;
19+
using IAsyncServiceProvider = Microsoft.VisualStudio.Shell.IAsyncServiceProvider;
1620

1721
namespace GitHub.VisualStudio.UI
1822
{
@@ -34,16 +38,17 @@ public class GitHubPane : ToolWindowPane, IServiceProviderAware
3438
bool initialized = false;
3539
IDisposable viewSubscription;
3640
IGitHubPaneViewModel viewModel;
41+
ContentControl contentControl;
3742

38-
FrameworkElement View
43+
public FrameworkElement View
3944
{
40-
get { return Content as FrameworkElement; }
45+
get { return contentControl.Content as FrameworkElement; }
4146
set
4247
{
4348
viewSubscription?.Dispose();
4449
viewSubscription = null;
4550

46-
Content = value;
51+
contentControl.Content = value;
4752

4853
viewSubscription = value.WhenAnyValue(x => x.DataContext)
4954
.SelectMany(x =>
@@ -61,6 +66,7 @@ FrameworkElement View
6166
public GitHubPane() : base(null)
6267
{
6368
Caption = "GitHub";
69+
Content = contentControl = new ContentControl();
6470

6571
BitmapImageMoniker = new Microsoft.VisualStudio.Imaging.Interop.ImageMoniker()
6672
{
@@ -83,17 +89,28 @@ public void Initialize(IServiceProvider serviceProvider)
8389
{
8490
if (!initialized)
8591
{
86-
var provider = VisualStudio.Services.GitHubServiceProvider;
87-
var teServiceHolder = provider.GetService<ITeamExplorerServiceHolder>();
88-
teServiceHolder.ServiceProvider = serviceProvider;
92+
InitializeAsync(serviceProvider).Forget();
93+
}
94+
}
8995

90-
var factory = provider.GetService<IViewViewModelFactory>();
91-
viewModel = provider.ExportProvider.GetExportedValue<IGitHubPaneViewModel>();
92-
viewModel.InitializeAsync(this).Forget();
96+
async Task InitializeAsync(IServiceProvider serviceProvider)
97+
{
98+
// Allow MEF to refresh its cache on a background thread so it isn't counted against us.
99+
var asyncServiceProvider = (IAsyncServiceProvider)GetService(typeof(SAsyncServiceProvider));
100+
await asyncServiceProvider.GetServiceAsync(typeof(SComponentModel));
93101

94-
View = factory.CreateView<IGitHubPaneViewModel>();
95-
View.DataContext = viewModel;
96-
}
102+
await ThreadingHelper.SwitchToMainThreadAsync();
103+
104+
var provider = VisualStudio.Services.GitHubServiceProvider;
105+
var teServiceHolder = provider.GetService<ITeamExplorerServiceHolder>();
106+
teServiceHolder.ServiceProvider = serviceProvider;
107+
108+
var factory = provider.GetService<IViewViewModelFactory>();
109+
viewModel = provider.ExportProvider.GetExportedValue<IGitHubPaneViewModel>();
110+
viewModel.InitializeAsync(this).Forget();
111+
112+
View = factory.CreateView<IGitHubPaneViewModel>();
113+
View.DataContext = viewModel;
97114
}
98115

99116
[SuppressMessage("Microsoft.Design", "CA1061:DoNotHideBaseClassMethods", Justification = "WTF CA, I'm overriding!")]

0 commit comments

Comments
 (0)