C#在循环中读取控制台应用程序

问题描述:

我需要为循环中的许多文件执行我的控制台应用程序并更新我的GUI。当我第一次执行我的应用程序时,一切正常,GUI更新实时完成。但是随着每一次迭代,控制台输出的读取会得到更长的延迟。 3-4文件后,我只得到几个更新或根本没有更新。它不是更新GUI的问题,我的dataraceivedevent不会启动。C#在循环中读取控制台应用程序

我不明白为什么,因为在每次迭代之后,我都会关闭并处理我的过程。

这是我在for循环中执行的方法。

public void execute(string arguments, string path) 
    { 
     Process myProcess = new Process(); 
     myProcess.StartInfo.CreateNoWindow = true; 
     myProcess.StartInfo.FileName = path; 
     myProcess.StartInfo.UseShellExecute = false; 
     myProcess.StartInfo.RedirectStandardOutput = true; 
     myProcess.StartInfo.Arguments = arguments; 
     myProcess.Start(); 
     myProcess.BeginOutputReadLine(); 
     myProcess.OutputDataReceived += new DataReceivedEventHandler(this.updateProgress); 
     myProcess.WaitForExit(); 
     myProcess.CancelOutputRead(); 
     myProcess.OutputDataReceived -= updateProgress; 
     myProcess.Close(); 
     myProcess.Dispose(); 

     if (progressBar1.InvokeRequired) 
     { 
      progressBar1.BeginInvoke(new Action(() => 
      { 
       progressBar1.PerformStep(); 
      })); 
     } 
     else 
     { 
      progressBar1.PerformStep(); 
     } 

     if (progressBar2.InvokeRequired) 
     { 
      progressBar2.BeginInvoke(new Action(() => 
      { 
       progressBar2.Value = 100; 
       progressBar2.Refresh(); 
      })); 
     } 
     else 
     { 
      progressBar2.Value = 100; 
      progressBar2.Refresh(); 
     } 

     if (this.InvokeRequired) 
     { 
      this.BeginInvoke(new Action(() => 
      { 
       this.Text = " "; 
      })); 
     } 
     else 
     { 
      this.Text = " "; 
     } 
     Thread.Sleep(500); 

    } 

执行100K次后,我有同样的问题,最后一次myProcess.WaitForExit();花了这么多时间。相反,您可以使用另一个重载,它使用一个整数来指示进程有多少毫秒退出。 myProcess.WaitForExit(1000);

+0

问题有时候我需要等待一小时,有时候只需几分钟。常数值对我来说不是一个解决方案。 – user1755589

+0

您可能想要查看此链接:http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.standarderror.aspx “该代码示例通过调用p.StandardError来避免死锁情况。在p.WaitForExit之前的ReadToEnd如果父进程在p.StandardError.ReadToEnd之前调用p.WaitForExit并且子进程写入足够的文本来填充重定向的流,则可能会导致死锁情况。父进程将无限期地等待子进程退出。子进程将无限期地等待父进程从完整的StandardError流中读取。“ – manman

请拨打后.BeginOutputReadLine();方法.OutputDataReceived += new DataReceivedEventHandler(...);

可能OutputDataReceived事件发生之前,你开始阅读(你附加的事件之前)

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline.aspx

,如:

myProcess.OutputDataReceived += new DataReceivedEventHandler(this.updateProgress); 
    myProcess.BeginOutputReadLine(); 
+0

杀死我的过程没有任何区别。 – user1755589

+0

我更新了答案。请尝试并让我们知道 – Ozgur