2012-10-18 72 views
1

我需要爲循環中的許多文件執行我的控制檯應用程序並更新我的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); 

    } 

回答

0

執行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

0

請撥打後.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