【问题标题】:Redirecting standard output causes program to not exit [duplicate]重定向标准输出导致程序不退出[重复]
【发布时间】:2017-05-21 20:23:00
【问题描述】:

我正在从Process.Start() 呼叫qaac.exe(AAC 编码器)。 qaac.exe 程序在编码时输出到同一行。我不确定它的技术术语是什么,但它会导致程序即使处理完文件也不会退出。这是我的代码:

string output = null;

var proc = new Process();

proc.StartInfo.FileName = "qaac.exe";
proc.StartInfo.Arguments = "-v256 -q2 file.wav";
proc.StartInfo.WorkingDirectory = @"C:\";
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.UseShellExecute = false;

proc.Start();

output = proc.StandardOutput.ReadToEnd();
output += "\r\n";
output += proc.StandardError.ReadToEnd();

proc.WaitForExit();

如果我在上面的代码中将-s 参数(抑制控制台消息)传递给qaac.exe 应用程序,它可以正常工作。所以我的问题是如何从一个写入控制台窗口同一行的外部程序中获取输出?

【问题讨论】:

  • 参考this link第二个答案(14+)
  • 根据您发布的小代码和您描述的行为,几乎可以肯定“qaac.exe”程序同时写入标准输出和标准错误,并且由于您尝试同时读取两者, “qaac.exe”进程死锁。有关如何修复,请参阅标记的重复项。如果您认为自己有一些不同的问题,请改进您的问题,以便它包含一个很好的minimal reproducible example,它可以可靠地重现问题。

标签: c#


【解决方案1】:

qaac.exe 是否正在写信给StandardError?正如the Process.StandardOutput 文档提到的那样,它的缓冲区可能已被填满,导致死锁。

// 为避免死锁,请至少对其中一个流使用异步读取操作。
// 不要对两个重定向流的末尾执行同步读取。

【讨论】:

  • AFAIK,qaac 没有写信给StandardError
  • @JMS10:如果它在没有完成的情况下停止,您可以使用您的调试器来确定它在停止之前达到了多远。
  • “AFAIK,qaac 没有写入 StandardError” - 如果这是真的,为什么你的帖子中的代码会重定向 stderr 并从中读取?您是否尝试过 not 重定向标准错误?您是否尝试过以 正确 的方式使用 stdout 和 stderr,如标记的重复项(@Guvante 应该找到并投票关闭作为重复项而不是再次回答)
猜你喜欢
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 2011-12-08
  • 2012-08-15
  • 1970-01-01
  • 2013-06-02
相关资源
最近更新 更多