单击按钮后程序冻结

本文关键字:冻结 程序 按钮 单击 | 更新日期: 2023-09-27 18:34:58

当我单击按钮时,程序冻结。我正在尝试访问根目录的 h 文件夹中的文件.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!");
        }

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

单击按钮后程序冻结

Process.WaitForExit();

从文档中:

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

这意味着Process.WaitForExit();方法将阻止,直到进程完成。如果进程运行了很长时间,您的应用程序将等待,它实际上并没有被冻结,它只是在执行它所指示的。

如果您实际上不想等待它完成并显示您的消息,只需像这样删除语句:

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

编辑

你的论点有问题。调试时,删除proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;proc.WaitForExit();,以便查看发生的情况。

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

如果要使用 cmd.exe 运行命令,则需要传递 /C 参数。例如:cmd.exe ping不起作用,则必须使用 cmd.exe /C ping .在您的情况下,参数可能应该是这样的:/C path/to/file.bat .

此行将使程序挂起:

proc.WaitForExit();

您将永远不会看到显示的消息框,因为应用程序正在等待您的进程退出。只需删除程序。WaitForExit(( 和您的消息将在进程仍在后台运行时显示。但是,如果您这样做,则必须确保正确处理所有内容(即应用程序关闭时进程死亡(

根据

MSDN,WaitForExit等待关联的进程退出,并阻止当前的执行线程,直到时间过去或进程退出。 "当前线程"是您从中启动它的线程;在这种情况下,您的主程序会导致您的挂起。