单击按钮后程序会冻结吗?

org*_*lce 1 c#

当我单击一个按钮时,程序会冻结.我试图在根目录的h文件夹中访问file.bat.这是我点击事件的代码:

private void button1_Click_1(object sender, EventArgs e)
    {
        {
            string pathName = textBox.Text;
            pathName = Path.GetFileName(pathName);

            string dir = System.Windows.Forms.Application.StartupPath;
            string dirEnd = dir + "\\h\\";

            Process proc = new Process();
            proc.StartInfo.FileName = "CMD.exe";
            proc.StartInfo.Arguments = "\"" + dirEnd + "file.bat" + "\"";
            proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            proc.Start();
            proc.WaitForExit();

            MessageBox.Show("Program has been started!");

        }
Run Code Online (Sandbox Code Playgroud)

如果我删除proc.WaitForExit();什么都不会发生但程序不会冻结.但是,如果我删除proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;CMD将启动但参数不会传递给它.

Hei*_*tad 5

Process.WaitForExit();
Run Code Online (Sandbox Code Playgroud)

来自文档:

指示Process组件无限期地等待关联进程退出.

这意味着该Process.WaitForExit();方法将一直阻塞,直到该过程结束.如果这个过程运行了很长时间,你的应用程序就会等待,它实际上并没有被冻结,它只是按照它所说的去做.

如果你实际上并不想等待它完成并显示你的消息而只是删除这样的语句:

proc.Start();
MessageBox.Show("Program has been started!");
Run Code Online (Sandbox Code Playgroud)

编辑

你的论点有问题.虽然调试运行,删除proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;proc.WaitForExit();所以你可以看到发生了什么.

在单独的变量中构建参数字符串并检查它以确保它是正确的.

如果要使用命令运行cmd.exe,则需要传递/C参数.例如:cmd.exe ping无法使用,必须使用cmd.exe /C ping.在你的情况下,论证应该是这样的:/C path/to/file.bat.