2014-01-28 225 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