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

Commit 8bf1864

Browse files
committed
Marshal OnStartSearch onto UI thread
OnStartSearch is called on a background thread. Marshal onto UI thread when updating view model.
1 parent c0aa176 commit 8bf1864

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

src/GitHub.VisualStudio/UI/GitHubPane.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ protected override void Initialize()
8282
// Using JoinableTaskFactory from parent AsyncPackage. That way if VS shuts down before this
8383
// work is done, we won't risk crashing due to arbitrary work going on in background threads.
8484
var asyncPackage = (AsyncPackage)Package;
85-
viewModelTask = asyncPackage.JoinableTaskFactory.RunAsync(() => InitializeAsync(asyncPackage));
85+
JoinableTaskFactory = asyncPackage.JoinableTaskFactory;
86+
87+
viewModelTask = JoinableTaskFactory.RunAsync(() => InitializeAsync(asyncPackage));
8688
}
8789

8890
public Task<IGitHubPaneViewModel> GetViewModelAsync() => viewModelTask.JoinAsync();
@@ -123,7 +125,7 @@ public override IVsSearchTask CreateSearch(uint dwCookie, IVsSearchQuery pSearch
123125

124126
if (pane != null)
125127
{
126-
return new SearchTask(pane, dwCookie, pSearchQuery, pSearchCallback);
128+
return new SearchTask(JoinableTaskFactory, pane, dwCookie, pSearchQuery, pSearchCallback);
127129
}
128130

129131
return null;
@@ -189,23 +191,29 @@ void UpdateSearchHost(bool enabled, string query)
189191

190192
class SearchTask : VsSearchTask
191193
{
194+
readonly JoinableTaskFactory joinableTaskFactory;
192195
readonly IGitHubPaneViewModel viewModel;
193196

194197
public SearchTask(
198+
JoinableTaskFactory joinableTaskFactory,
195199
IGitHubPaneViewModel viewModel,
196200
uint dwCookie,
197201
IVsSearchQuery pSearchQuery,
198202
IVsSearchCallback pSearchCallback)
199203
: base(dwCookie, pSearchQuery, pSearchCallback)
200204
{
205+
this.joinableTaskFactory = joinableTaskFactory;
201206
this.viewModel = viewModel;
202207
}
203208

204209
protected override void OnStartSearch()
205210
{
206-
ThreadHelper.ThrowIfNotOnUIThread();
211+
joinableTaskFactory.RunAsync(async () =>
212+
{
213+
await joinableTaskFactory.SwitchToMainThreadAsync();
214+
viewModel.SearchQuery = SearchQuery.SearchString;
215+
});
207216

208-
viewModel.SearchQuery = SearchQuery.SearchString;
209217
base.OnStartSearch();
210218
}
211219

@@ -224,5 +232,7 @@ public SearchQuery(string query)
224232

225233
public uint GetTokens(uint dwMaxTokens, IVsSearchToken[] rgpSearchTokens) => 0;
226234
}
235+
236+
public JoinableTaskFactory JoinableTaskFactory { get; private set; }
227237
}
228238
}

0 commit comments

Comments
 (0)