private void CreateServerProcessWorker(Func<IEnumerable<string>> preCreate, Action<CreateProcessResult> postCreate) { Logger.LogInfo("Creating VsChromiumHost process."); var path = GetProcessPath(); Logger.LogInfo(" Path={0}", path); var serverPath = Path.Combine(Path.GetDirectoryName(path.Value), ServerName); Logger.LogInfo(" Server path={0}", serverPath); var arguments = new List<string>(); arguments.Add(serverPath); arguments.AddRange(preCreate()); #if PROFILE_SERVER arguments.Add("/profile-server"); #endif var argumentLine = arguments.Aggregate("", (x, v) => x + QuoteArgument(v) + " "); Logger.LogInfo(" Arguments={0}", argumentLine); _serverProcess = _processCreator.CreateProcess(path.Value, argumentLine, CreateProcessOptions.AttachDebugger | CreateProcessOptions.BreakAwayFromJob); Logger.LogInfo("VsChromiumHost process created (pid={0}).", _serverProcess.Process.Id); postCreate(_serverProcess); }
private void AfterProxyCreated(CreateProcessResult serverProcess) { Logger.Log("AfterProxyCreated (pid={0}", serverProcess.Process.Id); var timeout = TimeSpan.FromSeconds(5.0); #if PROFILE_SERVER timeout = TimeSpan.FromSeconds(120.0); System.Diagnostics.Trace.WriteLine(string.Format("You have {0:n0} seconds to start the server process with a port argument of {1}.", timeout.TotalSeconds, ((IPEndPoint)_tcpListener.LocalEndpoint).Port)); #endif Logger.Log("AfterProxyCreated: Wait for TCP client connection from server process."); if (!_waitForConnection.WaitOne(timeout)) { throw new InvalidOperationException( string.Format("Child process did not connect to server within {0:n0} seconds.", timeout.TotalSeconds)); } _ipcStream = new IpcStreamOverNetworkStream(_serializer, _tcpClient.GetStream()); // Ensure process is alive and ready to process requests Logger.Log("AfterProxyCreated: Wait for \"Hello\" message from server process."); WaitForProcessHelloMessage(); // Start reading process output Logger.Log("AfterProxyCreated: Start receive response thread."); _receiveResponsesThread.ResponseReceived += response => { var callback = _callbacks.Remove(response.RequestId); callback(response); }; _receiveResponsesThread.EventReceived += @event => { OnEventReceived(@event); }; _receiveResponsesThread.Start(_ipcStream); Logger.Log("AfterProxyCreated: Start send request thread.."); _sendRequestsThread.RequestError += OnRequestError; _sendRequestsThread.Start(_ipcStream, _requestQueue); }