2011-02-18 25 views
3

我想在c#中读取cmd的连续输出流。我知道我可以重定向标准输出流并读取它。以下是代码:在c#中不断读取控制台流#

 System.Diagnostics.ProcessStartInfo pi= new System.Diagnostics.ProcessStartInfo(ProgramPATH,Params); 
     pi.RedirectStandardOutput = true; 
     pi.UseShellExecute = false; 
     pi.CreateNoWindow = true; 

     System.Diagnostics.Process proc= new System.Diagnostics.Process(); 
     proc.StartInfo = pi; 
     proc.Start(); 

     string result = proc.StandardOutput.ReadToEnd(); 

但是,这会给出整个输出一次。如果我用-t参数发出ping命令怎么办?我怎样才能不断阅读这个流?

回答

9

你打电话给ReadToEnd这将明显阻塞,直到进程终止。您可以反复拨打ReadReadLine。但是,您应该考虑使用或者在不同线程中使用诸如OutputDataReceived之类的事件来执行此操作。 (如果您使用的事件,你需要调用BeginOutputReadLine使事件 - 详见MSDN的例子)

的原因在不同的线程可能解读是,如果你需要从阅读标准错误和标准输出,您需要确保该进程不会填满其缓冲区 - 否则在写入时可能会阻塞,从而导致死锁。使用异步方法可以更简单地处理这个问题。

+0

你会介意在这种情况下如何使用事件扩展一点吗?谢谢。 – 2011-02-18 17:25:29