コード例 #1
0
ファイル: RSession.cs プロジェクト: jagadeesh1492/RTVS
            public async Task CompleteSwitchingBrokerAsync(CancellationToken cancellationToken)
            {
                if (_lockToken == null)
                {
                    throw new InvalidOperationException($"{nameof(AcquireLockAsync)} must be called before {nameof(CompleteSwitchingBrokerAsync)}");
                }

                _session._disposeToken.ThrowIfDisposed();


                if (_session._startupInfo == null)
                {
                    // Session never started. No need to restart it.
                    // Reset _initializationLock so that next awaiter can proceed.
                    _lockToken.Reset();
                    return;
                }

                var brokerClient = _session.BrokerClient;
                var startupInfo  = _session._startupInfo;
                var host         = _session._host;
                var hostRunTask  = _session._hostRunTask;

                // host may be null if previous attempts to start it have failed
                if (host != null)
                {
                    // Detach RHost from RSession
                    host.DetachCallback();

                    // Cancel all current requests
                    await _session.CancelAllAsync(cancellationToken);
                }

                // Start new RHost
                await _session.StartHostAsyncBackground(_hostToSwitch, _lockToken, cancellationToken);

                // Shut down the old host, gracefully if possible, and wait for old hostRunTask to exit;
                if (hostRunTask != null)
                {
                    await StopHostAsync(brokerClient, startupInfo?.Name, host, hostRunTask);
                }
                host?.Dispose();

                if (hostRunTask != null && hostRunTask.Status == TaskStatus.Running)
                {
                    await hostRunTask;
                }

                _hostToSwitch = null;
            }
コード例 #2
0
ファイル: RSession.cs プロジェクト: jflam/RTVS
            public async Task CompleteSwitchingBrokerAsync(CancellationToken cancellationToken)
            {
                using (_session._disposeToken.Link(ref cancellationToken)) {
                    if (!VerifyTransactionState(nameof(ConnectToNewBrokerAsync)))
                    {
                        return;
                    }

                    if (_hostToSwitch == null)
                    {
                        Debugger.Launch();
                    }

                    try {
                        var brokerClient = _session.BrokerClient;
                        var startupInfo  = _session._startupInfo;
                        var host         = _session._host;
                        var hostRunTask  = _session._hostRunTask;

                        // host may be null if previous attempts to start it have failed
                        if (host != null)
                        {
                            // Detach RHost from RSession
                            host.DetachCallback();

                            // Cancel all current requests
                            await _session.CancelAllAsync(cancellationToken);
                        }

                        // Start new RHost
                        await _session.StartHostAsyncBackground(_hostToSwitch, _lockToken, cancellationToken);

                        // Shut down the old host, gracefully if possible, and wait for old hostRunTask to exit;
                        if (hostRunTask != null)
                        {
                            await StopHostAsync(brokerClient, startupInfo?.Name, host, hostRunTask);
                        }
                        host?.Dispose();

                        if (hostRunTask != null)
                        {
                            await hostRunTask;
                        }
                    } finally {
                        _hostToSwitch = null;
                    }
                }
            }
コード例 #3
0
            public async Task CompleteSwitchingBrokerAsync(CancellationToken cancellationToken)
            {
                using (_session._disposeToken.Link(ref cancellationToken)) {
                    try {
                        var brokerClient = _session.BrokerClient;
                        var host         = _session._host;
                        var hostRunTask  = _session._hostRunTask;

                        // host may be null if previous attempts to start it have failed
                        if (host != null)
                        {
                            // Detach RHost from RSession
                            host.DetachCallback();

                            // Cancel all current requests
                            // If can't be canceled in 10s - just ignore, old host will be stopped later
                            await Task.WhenAny(_session.CancelAllAsync(cancellationToken), Task.Delay(10000, cancellationToken)).Unwrap();
                        }

                        // Start new RHost
                        await _session.StartHostAsyncBackground(_hostToSwitch, cancellationToken);

                        // Shut down the old host, gracefully if possible, and wait for old hostRunTask to exit;
                        if (hostRunTask != null && host != null)
                        {
                            await StopHostAsync(brokerClient, host, hostRunTask, true);
                        }
                        host?.Dispose();

                        if (hostRunTask != null)
                        {
                            await hostRunTask;
                        }
                    } finally {
                        _hostToSwitch = null;
                    }
                }
            }