由于StandardOutput.ReadToEnd()和StandardError.ReadToEnd()导致C#进程挂起

时间:2017-11-10 01:36:42

标签: c# process hang redirectstandardoutput

对于输出或错误很多的进程,尝试使用简单的

重定向标准输出和错误
string output = process.StandardOutput.ReadToEnd();
string err = process.StandardError.ReadToEnd();
process.WaitForExit();

将导致程序挂起,并且永远不会完成。

1 个答案:

答案 0 :(得分:1)

事实证明,大量的输出填满了ReadToEnd()的缓冲区,导致它们永远不会完成。对我来说似乎可靠工作的一个解决方案是创建一个事件处理程序来逐行响应输出,而不必立即对大块输出/错误做出反应。

//create event handler
process.OutputDataReceived += new DataReceivedEventHandler(
    (s, e) => 
    { 
        //do something with the output data 'e.Data'
        log.Info("O: "+e.Data);
    }
);
process.ErrorDataReceived += new DataReceivedEventHandler(
    (s, e) => 
    { 
        //do something with the error data 'e.Data'
        log.Info("E: "+e.Data);
    }
);
//start process
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();