Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows窗体在执行cmd.exe时被卡住_C#_Winforms_Command Line - Fatal编程技术网

C# Windows窗体在执行cmd.exe时被卡住

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");

我试图通过cmd执行一个命令,但当程序运行时,整个窗口被卡住,没有响应。无法按下按钮,无法关闭窗体等。 这是执行的代码:

    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如果我的答案对你有帮助,请考虑把它当成正确的答案。是的,我刚打字。它可能在主线程上,在后台工作线程或它自己的线程上工作会更好。我现在还不清楚,但是为什么命令完成后它不会再次响应。。。除非它永远不会完成…是的,正是我刚才输入的。它可能在主线程上,在后台工作线程或它自己的线程上工作会更好。我现在还不清楚,但是为什么命令完成后它不会再次响应。。。除非它永远不会完成。。。