public async Task <SessionWithSolution?> TryCreateSessionAsync(string serviceName, Solution solution, object?callbackTarget, CancellationToken cancellationToken) { var connection = await TryCreateConnectionAsync(serviceName, callbackTarget, cancellationToken).ConfigureAwait(false); if (connection == null) { return(null); } SessionWithSolution?session = null; try { // transfer ownership of the connection to the session object: session = await SessionWithSolution.CreateAsync(connection, solution, cancellationToken).ConfigureAwait(false); } finally { if (session == null) { connection.Dispose(); } } return(session); }
public static async Task <SessionWithSolution> CreateAsync(RemoteHostClient.Connection connection, Solution solution, CancellationToken cancellationToken) { Contract.ThrowIfNull(connection); Contract.ThrowIfNull(solution); var service = solution.Workspace.Services.GetRequiredService <IRemotableDataService>(); var scope = await service.CreatePinnedRemotableDataScopeAsync(solution, cancellationToken).ConfigureAwait(false); SessionWithSolution?session = null; try { // set connection state for this session. // we might remove this in future. see https://github.com/dotnet/roslyn/issues/24836 await connection.InvokeAsync( WellKnownServiceHubServices.ServiceHubServiceBase_Initialize, new object[] { scope.SolutionInfo }, cancellationToken).ConfigureAwait(false); // transfer ownership of connection and scope to the session object: session = new SessionWithSolution(connection, scope); } finally { if (session == null) { scope.Dispose(); } } return(session); }
public async Task <SessionWithSolution?> TryCreateSessionAsync(string serviceName, Solution solution, object?callbackTarget, CancellationToken cancellationToken) { var connection = await TryCreateConnectionAsync(serviceName, callbackTarget, cancellationToken).ConfigureAwait(false); if (connection == null) { return(null); } return(await SessionWithSolution.CreateAsync(connection, solution, cancellationToken).ConfigureAwait(false)); }
/// <summary> /// Create <see cref="SessionWithSolution"/> for the <paramref name="serviceName"/> if possible. /// otherwise, return null. /// /// Creating session could fail if remote host is not available. one of example will be user killing /// remote host. /// </summary> public static async Task<SessionWithSolution> TryCreateSessionAsync( this RemoteHostClient client, string serviceName, Solution solution, object callbackTarget, CancellationToken cancellationToken) { var connection = await client.TryCreateConnectionAsync(serviceName, callbackTarget, cancellationToken).ConfigureAwait(false); if (connection == null) { return null; } return await SessionWithSolution.CreateAsync(connection, solution, cancellationToken).ConfigureAwait(false); }
public static async Task <SessionWithSolution> CreateAsync(RemoteHostClient.Connection connection, PinnedRemotableDataScope scope, CancellationToken cancellationToken) { var sessionWithSolution = new SessionWithSolution(connection, scope); try { await connection.RegisterPinnedRemotableDataScopeAsync(scope).ConfigureAwait(false); return(sessionWithSolution); } catch { sessionWithSolution.Dispose(); // we only expect this to happen on cancellation. otherwise, rethrow cancellationToken.ThrowIfCancellationRequested(); throw; } }
public static async Task <SessionWithSolution> CreateAsync(RemoteHostClient.Connection connection, PinnedRemotableDataScope scope, CancellationToken cancellationToken) { var sessionWithSolution = new SessionWithSolution(connection, scope); try { // set connection state for this session. // we might remove this in future. see https://github.com/dotnet/roslyn/issues/24836 await connection.InvokeAsync( WellKnownServiceHubServices.ServiceHubServiceBase_Initialize, new object[] { scope.SolutionInfo }, cancellationToken).ConfigureAwait(false); return(sessionWithSolution); } catch { sessionWithSolution.Dispose(); // we only expect this to happen on cancellation. otherwise, rethrow cancellationToken.ThrowIfCancellationRequested(); throw; } }