【问题标题】:Reading console stream continually in c#在 C# 中不断读取控制台流
【发布时间】:2022-03-10 00:54:16
【问题描述】:

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

        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 命令怎么办?我怎样才能不断地阅读这个流?

【问题讨论】:

    标签: c# process


    【解决方案1】:

    您正在调用ReadToEnd,这显然会阻塞,直到进程终止。您可以重复调用ReadReadLine。但是,您应该考虑或者在不同的线程中执行此操作使用诸如OutputDataReceived 之类的事件来执行此操作。 (如果您使用事件,则需要调用 BeginOutputReadLine 来启用事件 - 详情请参阅 MSDN 示例。)

    可能在不同线程上读取的原因是,如果您需要从 标准错误和标准输出中读取,则需要确保进程不会填满其缓冲区 - 否则它在写入时可能会阻塞,从而有效地导致死锁。使用异步方法可以更轻松地处理此问题。

    【讨论】:

    • 您介意扩展一下在这种情况下如何使用事件吗?谢谢。
    • @Paul:你读过我链接的文档吗?那里有一些例子应该对你有很大帮助。如果有某些特定方面造成混淆,请准确说明。
    • 很棒的信息。谢谢!我想知道您在考虑事件方面的想法,并且没有考虑 Process 类的事件。
    【解决方案2】:

    为了为不想查看文档的人节省时间,请参阅 StartProcess 和 HandleExeOutput 方法中的最后两行:

    void StartProcess()
    {
      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();
    
      proc.OutputDataReceived += HandleExeOutput;
      proc.BeginOutputReadLine();
    }
    
    private void HandleExeOutput(object sender, DataReceivedEventArgs e)
    {
        string output = e.Data;
        // do something here with the string output
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      相关资源
      最近更新 更多