从C#通过Process类生成时,正确处理程序的标准错误和输出的方法?

ang*_*son 7 .net subprocess process waitforexit redirectstandardoutput

我阅读了Process.StandardOutput的文档,其中包含以下引用:

如果父进程在p.StandardOutput.ReadToEnd之前调用p.WaitForExit并且子进程写入足够的文本来填充重定向的流,则可能导致死锁条件.

所以我很想知道.如果我还害怕在某些情况下可以填充StandardError,那么正确的方法是什么?

我是否必须使用循环来交替读取标准输出和错误,以避免填充,或者这个简单的代码是否足够:

string error = proc.StandardError.ReadToEnd();
string output = proc.StandardOutput.ReadToEnd();
bool didFinish = proc.WaitForExit(60000);
Run Code Online (Sandbox Code Playgroud)

在发布了一些答案后编辑

那么这是正确的方法吗?

var output = new StringBuilder();
proc.OutputDataReceived += (s, e) => output.Append(e.Data);
proc.BeginOutputReadLine();
string error = proc.StandardError.ReadToEnd();
bool didFinish = proc.WaitForExit(60000);
Run Code Online (Sandbox Code Playgroud)

然后我只在进程实际完成时才使用stringbuilder内容.

这是正确的方法吗?

Cod*_*lla 7

您的示例代码可能会导致死锁,其中有一些内容写入,StandardOutput而不是写入StandardError.您链接的文档中的下一个示例也说明了这一点.

基本上,我建议使用两个流上的异步读取来填充缓冲区,因为Streams被写入,然后调用WaitForExit.