예제 #1
0
        private void ResetFull()
        {
            if (m_process != null)
            {
                ResetEvents();

                m_process.OutputDataReceived -= m_options.Events.OnOutputDataReceived;
                m_process.ErrorDataReceived  -= m_options.Events.OnErrorDataReceived;

                m_process.Close();
                m_process = null;
            }
        }
예제 #2
0
        private async Task StartAsync(CancellationToken token = default)
        {
            if (m_process != null)
            {
                throw new InvalidOperationException($"Host process is already running (process ID {m_process.Id})");
            }

            string commandLine = null;

            try
            {
                m_process   = new HostProcessClient(m_client, m_pipeName, m_options);
                commandLine = m_process.CommandLine;
                m_process.ErrorDataReceived  += m_options.Events.OnErrorDataReceived;
                m_process.OutputDataReceived += m_options.Events.OnOutputDataReceived;
                m_process.EnableRaisingEvents = true;

                if (m_options.RestartAfterCrash)
                {
                    m_process.Exited += OnExited;
                }

                if (await m_process.StartAsync(m_options.StartWaitTimeout, token).ConfigureAwait(false))
                {
                    m_options.Events.OnHostStarted(m_process.Id, commandLine);
                }
                else
                {
                    m_process.Dispose();
                    m_process = null;

                    if (!m_options.Events.OnHostStartFailed(commandLine, null))
                    {
                        throw new IsolationException("Failed to start host process");
                    }
                }
            }
            catch (Exception ex)
            {
                m_process?.Dispose();
                m_process = null;

                if (!m_options.Events.OnHostStartFailed(commandLine, ex))
                {
                    throw new IsolationException("Failed to start host process", ex);
                }
            }
        }