从服务启动进程挂起UseShellExecute false

时间:2016-11-18 15:35:26

标签: c# service backgroundworker

我遇到了一件奇怪的事情,无法找到原因。

我有一个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

那么我如何才能获得标准错误输出但不会让进程阻止我的主要任务继续?

1 个答案:

答案 0 :(得分:0)

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

向下选民:解释为什么会受到赞赏。

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

      // 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();