C# Windows窗体在执行cmd.exe时被卡住
我试图通过cmd执行一个命令,但当程序运行时,整个窗口被卡住,没有响应。无法按下按钮,无法关闭窗体等。 这是执行的代码:C# Windows窗体在执行cmd.exe时被卡住,c#,winforms,command-line,C#,Winforms,Command Line,我试图通过cmd执行一个命令,但当程序运行时,整个窗口被卡住,没有响应。无法按下按钮,无法关闭窗体等。 这是执行的代码: private void buttonStartTests_Click(object sender, EventArgs e) { String command = @"/c perl script.pl"; ProcessStartInfo cmdsi = new ProcessStartInfo("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();
}
问题是:如何防止它卡住
<>编辑:命令完成后,表单再次响应(只是为了使事情变得清楚)。
你应该考虑在后台进程中启动CMD——
我认为你这样做的话,在cmd返回之前,主线程将没有响应。。? 所以它阻塞了主线程后台工作人员可能是一个选项。
您应该考虑在后台进程中启动CMD——
我认为你这样做的话,在cmd返回之前,主线程将没有响应。。? 所以它阻塞了主线程Backgroundworker可能是一个选项。您可以使用.net 4.5的功能,如
wait
和async
,因为它不是异步的,所以它按顺序执行所有代码,应用程序的其余部分等待它。当触发此事件处理程序时,窗口将变得无响应,并且永远不会返回到响应状态,因为此事件中发生的任何事情都永远不会完成。您可以尝试设置事件的断点,然后进入代码以查看其挂起的位置。@ USER 116959如果我的答案帮助您,请考虑将其选为正确答案。您可以使用.NET 4.5个特性,如<代码>等待< /代码>和<代码>异步> /代码>,也就是说,它不是异步的,因此,它按顺序执行所有代码,应用程序的其余部分等待它。当触发此事件处理程序时,窗口将变得无响应,并且永远不会返回到响应状态,因为此事件中发生的任何事情都永远不会完成。你可以试着在事件上设置一个断点,然后进入代码看看它挂在哪里。@ USS116959如果我的答案对你有帮助,请考虑把它当成正确的答案。是的,我刚打字。它可能在主线程上,在后台工作线程或它自己的线程上工作会更好。我现在还不清楚,但是为什么命令完成后它不会再次响应。。。除非它永远不会完成…是的,正是我刚才输入的。它可能在主线程上,在后台工作线程或它自己的线程上工作会更好。我现在还不清楚,但是为什么命令完成后它不会再次响应。。。除非它永远不会完成。。。