【问题标题】:StandardOutput ReadToEnd when process pauses by default进程默认暂停时的 StandardOutput ReadToEnd
【发布时间】:2011-09-06 13:13:48
【问题描述】:

我一定浏览过数百篇与 StandardOutput ReadtoEnd 停止相关的文章,但似乎没有一篇能回答我的具体问题。

我的情况是,我正在为要在我的 ASP.NET MVC 应用程序中使用的第 3 方控制台应用程序创建一个包装器。我开始这个过程,将一个输入字符串(它是一个字符串格式的点文件)传递给它,然后应用程序返回一个文件(在这种情况下为 pdf)。

文件被放入标准输出(根据文档),但我似乎无法读取数据。

当我手动运行控制台应用程序时,我在输出窗口中以文本形式收到文件,但程序从未真正“退出”。我必须 CTRL+C 才能结束进程。

我猜这就是我打电话给

的原因
process.StandardOutput.ReadToEnd(); 

就挂了?

任何人都可以对我做错的事情有所了解。我想从我的方法调用中以byte[] 的形式返回在输出中收到的文件。

感谢和道歉,如果这似乎是重复的。

【问题讨论】:

  • 你处理了吗。RedirectStandardOutput = true;并确保检查控制台应用程序。正在将 STDOut 输出到 StandardError Stream 。

标签: c# process console wrapper


【解决方案1】:

有两个问题:

  1. ReadToEnd() 返回一个字符串。这不是一个好主意,如果数据是二进制的
  2. ReadToEnd() 不会返回,因为程序永远不会退出

因此,请尝试使用更底层的流方法(例如 Stream.Read)读取底层流 (process.StandardOutput.BaseStream),并在程序完成发送数据时检测自己。

【讨论】:

  • 丹尼尔,这真的很有帮助,谢谢。我还有一个可能非常基本的问题。我如何知道基于流的 byte[] 的数组大小,或者这不是很重要?现在我正在传递一个缓冲区字节[10000],知道我的输出实际上约为 8000。
  • 如果缓冲区太小,重复调用Read即可。请参阅文档中的示例。
  • 谢谢丹尼尔。第二次调用 Read 似乎只是挂起,但无论如何,这是一个单独的问题。再次感谢您的帮助伙伴,非常感谢。
  • @Jamie:是的,您的 3rd 方应用程序有问题。它应该在完成工作后退出。
  • 在读取输出之前关闭输入流似乎可以解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多