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; } }
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); } } }