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);
    }
Esempio n. 2
0
        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);
        }