从挂起的服务启动进程

本文关键字:启动 进程 服务 挂起 | 更新日期: 2023-09-27 18:18:33

我遇到了一个奇怪的事情,不知道为什么会发生。

我有一个service.exe,我从配置注册表中收集数据,然后启动n个进程。

示例代码:

_mProcess.StartInfo = new ProcessStartInfo
{
  FileName = Command,
  Arguments = Argument,
  WorkingDirectory = WorkDir
};
_mProcess.Start();
Pid = _mProcess.Id;

我的Pid包含进程id。

现在我添加UseShellExecute = false来获得StandardOutput。

新的示例代码:

_mProcess.StartInfo = new ProcessStartInfo
{
  FileName = Command,
  Arguments = Argument,
  WorkingDirectory = WorkDir //,
  //CreateNoWindow = true,
  UseShellExecute = false,
  //RedirectStandardOutput = true,
  RedirectStandardError = true
  //RedirectStandardInput = true
};
_mProcess.Start();
Pid = _mProcess.Id;
using (var reader = _mProcess.StandardError)
{
  _logger.ToLog("", Company, reader.ReadToEnd(), "RCluster.log", "service");
}

在这种情况下,进程返回任何错误,我可以存储到我的日志文件。

问题:这段代码是启动一个进程的方法的一部分,我多次调用这个进程(取决于我的配置)。因此,在这段代码中,第一个进程被调用,接下来的进程不被调用。不知何故,服务现在等待第一个服务。我以为这只发生在WaitForExit

那么我如何才能得到标准错误输出,但不使进程阻塞我的主要任务继续?

从挂起的服务启动进程

@Gusman:添加你的评论作为答案,你给我带来了正确的答案。那么我可以接受你的意见作为答案。

致反对票:请解释一下原因。

致所有人:我添加了一些代码来启动新进程作为一个线程。在这种情况下,在另一个线程中启动它以获取' standderror消息是有意义的,但不要阻塞主进程(在我的情况下,这是一个启动许多子进程的服务)。

      // start as new thread to prevent blocking
      var ths = new ThreadStart(() =>
      {
        mProcess.Start();
        Pid = mProcess.Id;
        // write pid file
        File.WriteAllText(RubyDir + @"'tmp'pids'" + Port + @".pid", Pid.ToString());
        using (var reader = mProcess.StandardError)
        {
          var errorMsg = reader.ReadToEnd();
          if (errorMsg.Length > 0) _logger.ToLog("", Company, errorMsg, "SOLR.log", "service");
        }
      });
      var th = new Thread(ths);
      th.Start();