C# - 进程 - 异步 - 读取所有输出

时间:2018-04-30 17:11:34

标签: c# asynchronous process

尝试使用Process类及其async功能。无法在程序退出之前弄清楚如何从Process读取所有输出。请帮忙!!

这是我的代码,

void RunProcess()
{
  Process process = new Process
  {
      StartInfo = new ProcessStartInfo
      {
          FileName = CmdName,
          Arguments = CmdArgs,
          CreateNoWindow = true,
          WindowStyle = ProcessWindowStyle.Hidden,
          RedirectStandardOutput = true,
          RedirectStandardError = true,
          UseShellExecute = false
      }
  };

  using(process)
  {
      process.OutputDataReceived += Process_OutputDataReceived;

      process.Start();
      process.BeginOutputReadLine();

      process.WaitForExit(); // Even waiting for exit here.

      _logger.Debug("End of process");
  }
} // void RunProcess()

void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
  if (!String.IsNullOrEmpty(e.Data))
      _logger.Debug($"\t{e.Data}");
}

我有一个其他代码在调用RunProcess()方法后至少再运行30到45秒,但是在日志中的任何地方都看不到我的进程的输出。

如果我同步运行程序,我会得到所有输出。但是在运行异步时看不到输出。有谁知道我做错了什么,拜托?

(更新问题以使其更清晰!)

我上面发布的代码有效,并且是最小的(剥离的验证,类等)。我正在寻找有关如何使程序停止直到在日志文件中捕获完整输出的建议。有没有人知道如果有一种方法可以通过WaitForExit和事件调用的组合来实现,就像我在上面的代码中那样,好吗?似乎该过程首先完成并在它可以打印日志行之前终止事件处理程序。

非常感谢提前!!

1 个答案:

答案 0 :(得分:0)

您可以更好地整理代码。制作一些课程来包含你的过程。看看如何做async / await。

删除下面的行并从流程中读取其自身的输出,而不是委派它。

  process.OutputDataReceived += Process_OutputDataReceived;

How and When to use `async` and `await`