2012-10-21 48 views
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中,而有些则是空白的。

感谢

回答

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(); 
    }); 
} 
+0

+1从我指出线 - theLine关系。我今天学了些新东西。 –

+0

谢谢Martin,非常感谢。 – poldoj

2

只要改变,而不是ReadLine()这里,把line。你已经在你的while循环读取线

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

}); 

编辑: MartinStettner给出的答案是更好的。在执行委托之前可能会出现line更改的情况,因此某些行可能会丢失,而其他行可能会重复。因此,我会根据马丁的说法改变我的答案,我想指出,他应该是那个会为此答案作出贡献的人。

+0

+1这应该是问题 –

+0

@lazyberezovsky是的,它应该在大多数情况下,但MartinStettner是正确的。在某些情况下,我可以想象(缓慢的图形卡或其他),在新的ReadLine()发生之前委托不会被执行,并且变量行将被更改,以便最终丢失一些行。所以这个代码不如Martin的那么好。 –

+0

非常感谢你,这确实是问题:) – poldoj