C#在'x'行后暂停流读取器输出然后继续

Posted

技术标签:

【中文标题】C#在\'x\'行后暂停流读取器输出然后继续【英文标题】:C# pause streamreader output after 'x' amount of lines then continueC#在'x'行后暂停流读取器输出然后继续 【发布时间】:2015-09-02 08:56:58 【问题描述】:

我正在开发一个实现 SSH.Net 库的 C# 程序。该程序的一项功能允许通过 SSH 将命令发送到目标服务器,然后在文本字段中显示输出。

这很好用,但是当输出响应很大时我遇到了问题。 目前所有输出都显示,直到完成。我需要一种方法,例如显示 30 行,然后等待用户输入,显示接下来的 30 行。

我可以使用 for 循环和计数器轻松地将输出停止在 30 行,但我不确定如何再次启动它,如何回到流读取器中的同一点?

    var list = new List<string>();
                string line;
                output_textBox.Text = String.Empty;

                while (!asynch.IsCompleted)
                
                    using (StreamReader sr = new StreamReader(cmd.OutputStream))
                    
                        while ((line = sr.ReadLine()) != null)
                        

                                list.Add(line);
                                Console.WriteLine(line);

                        
                    

                

谢谢

编辑

得到它与下面的工作。

 using (StreamReader sr = new StreamReader(cmd.OutputStream))
                    
                        while (!sr.EndOfStream)
                      
                          while (line_count < 100 && (line = sr.ReadLine())      != null)
                        

                            Console.SetOut(new     TextBoxWriter(output_textBox));
                            Console.WriteLine(line);
                            line_count++; 
                        
                          MessageBox.Show("OK to continue"); 
                          line_count = 0; 
                    

【问题讨论】:

您在寻找yield return吗? 从 SSH 命令返回的内容可能有 1000 行长,我想显示 100,然后等待用户点击按钮/键,然后再继续下 100 行 【参考方案1】:

看来您正在使用并行编程。您可以编写两个函数作为生产者和消费者。例如,生产者会不断读取您的文本并将其放入内存列表中,而消费者将按照您的适当时间间隔从列表中消费(并删除消费的行)。

【讨论】:

【参考方案2】:

回到你上次完成的那一行:

int startFrom = 30; // skip first 30 lines

using (StreamReader rdr = new StreamReader(fs))

    // skip lines
    for (int i = 0; i < startFrom ; i++)  
        rdr.ReadLine();  
    
    // ... continue with processing file  

更新

public void Process()  
    //init
    int startFrom = 0;
    int stepCount = 100;

    //read data  0 - 100
    ReadLines(startFrom, stepCount);
    startFrom += stepCount;

    // after user action
    //read data  100 - 200
    ReadLines(startFrom, stepCount);


public void ReadLines( int skipFirstNum, int readNum ) 
    using (StreamReader rdr = new StreamReader(cmd.OutputStream)) 
        // skip lines
        for (int i = 0; i < skipFirstNum; i++)  
             rdr.ReadLine();  
        
        for (int i = 0; i < readNum ; i++)  
             // ... these are the lines to process
        
    

【讨论】:

从 SSH 命令返回的内容可能有 1000 行长,我想显示 100,然后等待用户点击按钮/键,然后再继续下 100 行 我实际上并没有从文件中读取,它是对服务器上发出的命令的 SSH 响应 谢谢 ... 几乎就像我现在想要的那样,请参阅更新的代码。现在它在 100 行后显示一个文本框,单击 ok 使其继续。

以上是关于C#在'x'行后暂停流读取器输出然后继续的主要内容,如果未能解决你的问题,请参考以下文章

了解下C# 文件的输入与输出

C#输入输出流中中文乱码问题

在 C# 中为命令提示符创建实时输入和输出流

C# - 批处理文件输出不显示“按任意键继续...”直到我按下一个键

Java IO流--标准输入,输出流的使用

如何读取上一个命令的输出然后继续执行下一个命令