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

问题描述 投票:-1回答:1

尝试使用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和事件调用相结合,就像我上面的代码一样,好吗?似乎该过程首先完成并在它可以打印日志行之前终止事件处理程序。

提前谢谢了!!

c# asynchronous process
1个回答
0
投票

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

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

  process.OutputDataReceived += Process_OutputDataReceived;

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

© www.soinside.com 2019 - 2024. All rights reserved.