ReadToEnd来自std输出的进程和waitforexit

时间:2012-09-10 19:19:55

标签: c#

从使用新创建进程的stdoutput的MSDN示例:

    // This is the code for the base process
    Process myProcess = new Process();
    // Start a new instance of this program but specify the 'spawned' version.
    ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(args[0], "spawn");
    myProcessStartInfo.UseShellExecute = false;
    myProcessStartInfo.RedirectStandardOutput = true;
    myProcess.StartInfo = myProcessStartInfo;
    myProcess.Start();
    StreamReader myStreamReader = myProcess.StandardOutput;
    // Read the standard output of the spawned process. 
    string myString = myStreamReader.ReadLine();
    Console.WriteLine(myString);
    myProcess.WaitForExit();
    myProcess.Close();

如果不是myStreamReader.ReadLine()而是使用myStreamReader.ReadToEnd(),我仍然会使用myProcess.WaitForExit()吗? 或者ReadToEnd()会等到过程结束?

2 个答案:

答案 0 :(得分:3)

修改 抱歉转移,直接回答您的问题。是的,您需要致电Process.WaitForExit();。这将确保在您致电ReadToEnd()

之前,该流程已产生 所有输出

ReadToEnd是同步功能。因此,如果您不在代码中调用它,它将阻止您的主线程,直到它从StandardOutput捕获 仅第一个输出 ,然后就是它。但是使用WaitForExit将确保你拥有一切。

您也可以考虑对流程的输出进行异步读取,请参阅实现OutputDataRecieved的{​​{3}}

答案 1 :(得分:1)

“ReadToEnd”是存储在“StreamReader”对象中的函数,我不认为它与等待进程退出有关,但“Process”类可能会处理它本身。顺便说一下,“StreamReader”所具有的所有功能在你提到的情况下都没用。

在我看来,应该调用“WaitForExit”,并且你也会“关闭”。因为它们会释放一些其他方法无法实现的系统资源。据我所知,“ReadToEnd”方法与调用这两个方法无关。

干杯