提交 2acccc48 编写于 作者: H Heejae Chang

make VS not crash when service hub failed to launch

上级 385dbe98
......@@ -113,7 +113,9 @@ public void Disable()
try
{
instanceTask.Wait(_shutdownCancellationTokenSource.Token);
instanceTask.Result.Shutdown();
// result can be null if service hub failed to launch
instanceTask.Result?.Shutdown();
}
catch (OperationCanceledException)
{
......@@ -151,6 +153,11 @@ private async Task<RemoteHostClient> EnableAsync(CancellationToken cancellationT
// if we reached here, IRemoteHostClientFactory must exist.
// this will make VS.Next dll to be loaded
var instance = await _workspace.Services.GetRequiredService<IRemoteHostClientFactory>().CreateAsync(_workspace, cancellationToken).ConfigureAwait(false);
if (instance == null)
{
return null;
}
instance.ConnectionChanged += OnConnectionChanged;
return instance;
......
......@@ -9,7 +9,7 @@ internal static class RemoteHostOptions
public const string OptionName = "FeatureManager/Features";
[ExportOption]
public static readonly Option<bool> RemoteHost = new Option<bool>(OptionName, nameof(RemoteHost), defaultValue: false);
public static readonly Option<bool> RemoteHost = new Option<bool>(OptionName, nameof(RemoteHost), defaultValue: true);
[ExportOption]
public static readonly Option<int> SolutionChecksumMonitorBackOffTimeSpanInMS = new Option<int>(OptionName, nameof(SolutionChecksumMonitorBackOffTimeSpanInMS), defaultValue: 10000);
......
......@@ -5,6 +5,7 @@
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Host.Mef;
using Roslyn.Utilities;
namespace Microsoft.VisualStudio.LanguageServices.Remote
{
......@@ -13,8 +14,18 @@ internal class RemoteHostClientFactory : IRemoteHostClientFactory
{
public Task<RemoteHostClient> CreateAsync(Workspace workspace, CancellationToken cancellationToken)
{
// this is the point where we can create different kind of remote host client in future (cloud or etc)
return ServiceHubRemoteHostClient.CreateAsync(workspace, cancellationToken);
try
{
// this is the point where we can create different kind of remote host client in future (cloud or etc)
return ServiceHubRemoteHostClient.CreateAsync(workspace, cancellationToken);
}
catch
{
// currently there is so many moving parts that cause, in some branch/drop,
// service hub not to work. in such places (ex, Jenkins), rather than crashing VS
// right away, let VS run without service hub enabled.
return SpecializedTasks.Default<RemoteHostClient>();
}
}
}
}
\ No newline at end of file
......@@ -15,13 +15,20 @@ internal class RemoteHostClientFactory : IRemoteHostClientFactory
{
public Task<RemoteHostClient> CreateAsync(Workspace workspace, CancellationToken cancellationToken)
{
// this is the point where we can create different kind of remote host client in future (cloud or etc)
if (workspace.Options.GetOption(RemoteHostClientFactoryOptions.RemoteHost_InProc))
try
{
return InProcRemoteHostClient.CreateAsync(workspace, cancellationToken);
}
// this is the point where we can create different kind of remote host client in future (cloud or etc)
if (workspace.Options.GetOption(RemoteHostClientFactoryOptions.RemoteHost_InProc))
{
return InProcRemoteHostClient.CreateAsync(workspace, cancellationToken);
}
return ServiceHubRemoteHostClient.CreateAsync(workspace, cancellationToken);
return ServiceHubRemoteHostClient.CreateAsync(workspace, cancellationToken);
}
catch
{
return Task.FromResult<RemoteHostClient>(null);
}
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册