2014-01-28 227 views
2

我試圖通過cmd執行一個命令,但是當程序運行時,整個窗口卡住了而且沒有響應。不能按按鈕時,不能關閉窗體等 這是執行代碼:Windows Form在執行cmd.exe時卡住了

private void buttonStartTests_Click(object sender, EventArgs e) 
    { 
     String command = @"/c perl script.pl"; 
     ProcessStartInfo cmdsi = new ProcessStartInfo("cmd.exe"); 
     cmdsi.Arguments = command; 
     cmdsi.UseShellExecute = false; 
     cmdsi.RedirectStandardOutput = true; 
     cmdsi.RedirectStandardError = true; 
     cmdsi.RedirectStandardInput = true; 

     cmdsi.CreateNoWindow = true; 

     Process cmd = Process.Start(cmdsi); 

     String outstr; 

     while ((outstr = cmd.StandardOutput.ReadLine()) != null) 
     { 
      this.richTextBoxTestOutput.Text += (outstr + "\n"); 
      this.richTextBoxTestOutput.Update(); 
     } 

     //Wait for process to finish 
     //cmd.WaitForExit(); 

     cmd.Close(); 
    } 

的問題是:我怎麼防止它被卡住?

編輯:一旦命令完成(只是爲了弄清楚事情),表單會變得響應。

+0

您可以像使用'await'和'async' –

+0

那樣使用.net 4.5功能,它不是異步的,所以它按順序執行所有代碼,並且應用程序的其餘部分等待它。當此事件處理程序被觸發時,窗口變得無響應,並且永遠不會返回到響應狀態,因爲此事件中的任何事情都不會完成。您可以嘗試設置事件的中斷點,然後進入代碼以查看掛起的位置。 – 2014-01-28 08:26:29

+0

@ user116969如果我的答案幫助了你,請考慮選擇它作爲正確的答案。 –

回答

4

你應該考慮開始cmd在後臺進程 -

,我認爲你做的方式,直到CMD提供了一個回報mainthread會毫無反應..? 所以它阻止了主線程。

Backgroundworker可能是一個選項。

+0

是的,正是我剛纔輸入的內容。它可能在主線程上,並且可以在後臺工作者或自己的線程上更好地工作。然而,它對我來說並不是很清楚,爲什麼它在命令完成後不會再次響應......除非它從未完成...... – 2014-01-28 08:21:19