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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# - 进程 - 异步 - 读取所有输出相关的知识,希望对你有一定的参考价值。

尝试使用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($"	{e.Data}");
}

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

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

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

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

提前谢谢了!!

答案

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

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

  process.OutputDataReceived += Process_OutputDataReceived;

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

以上是关于C# - 进程 - 异步 - 读取所有输出的主要内容,如果未能解决你的问题,请参考以下文章

父进程无法读取来自 C 中 4 个不同管道的所有消息

C:从标准输出块中读取

如何在CEF JS与browser进程间异步通信

从给定的 txt 中读取所有数字并将它们输出到 c 中的新文件中

C中的进程间通信

C命名管道不适用于多进程