1

我正在尝试检索由我启动的进程生成的输出行,这是代码

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    foreach (myData singleJob in e.Argument as List<myData>)
    {
        ProcessStartInfo psi = new ProcessStartInfo("myCommandLineProgram.exe");
        psi.Arguments = "\"" + singleJob.row + "\"";
        psi.CreateNoWindow = true;
        psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        psi.RedirectStandardInput = true;
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardError = true;
        psi.UseShellExecute = false;
        Process p = new Process();
        p.StartInfo = psi;
        p.Start();
        StreamReader sr = p.StandardOutput ;
        string line;
        while ((line = sr.ReadLine()) != null )
        {
            this.Invoke((MethodInvoker)delegate
            {
                    richTextBox1.AppendText(sr.ReadLine() + Environment.NewLine);
                    richTextBox1.ScrollToCaret();   

            });
        }

        //StreamReader streamOutput = p.StandardOutput;
        //string content = streamOutput.ReadToEnd();   
        //this.Invoke((MethodInvoker)delegate
        //{
        //    richTextBox1.AppendText(content + Environment.NewLine);
        //});

        p.WaitForExit();
    }
}

虽然注释掉的代码始终有效(但它不会逐行解析),但上面的代码有些错误,确实有些行未能出现在 Richtextbox 中,而另一些则为空白。

谢谢

4

2 回答 2

3

那不应该是这样的吗

richTextBox1.AppendText(line + Environment.NewLine);

line而不是sr.ReadLine())?

调用readLine()两次将丢弃每一行。

此外,由于您正在调用ReadLine委托,因此您无法控制读取发生的时间。可能有几个ReadLines()(从while线)介于两者之间。

请注意,您也不应该使用该line变量:该变量始终引用循环中的同一行变量,该变量在AppendText执行时可能包含新内容。您应该在循环中引入一个新的局部变量,例如

 while ((line = sr.ReadLine()) != null )
 {
   var theLine = line;
   this.Invoke((MethodInvoker)delegate
   {
       richTextBox1.AppendText(theLine + Environment.NewLine);
       richTextBox1.ScrollToCaret();   
   });
 }
于 2012-10-21T21:48:58.563 回答
2

只需在此处更改而不是ReadLine(), put line。您已经阅读了 while 循环中的行

string appendingLine = line;
this.Invoke((MethodInvoker)delegate
{
          richTextBox1.AppendText(appendingLine + Environment.NewLine);
          richTextBox1.ScrollToCaret();   

});

编辑: MartinStettner 给出的答案更好。可能存在在line执行委托之前发生更改的情况,因此某些行可能会丢失,而另一些行可能会重复。因此,我将根据马丁的答案更改我的答案,并且我想指出他应该是这个答案的功劳。

于 2012-10-21T21:46:47.963 回答