1

当我单击一个按钮时,程序会冻结。我正在尝试访问根目录的 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!");

        }

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

4

3 回答 3

5
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.

于 2013-10-10T15:04:39.863 回答
2

此行将使您的程序挂起:

proc.WaitForExit();

您永远不会看到显示的消息框,因为应用程序正在等待您的进程退出。只需删除 proc.WaitForExit() ,您的消息就会在进程仍在后台运行时显示。但是,如果您这样做,您必须确保一切都得到正确处理(即当您的应用程序关闭时进程终止)

于 2013-10-10T15:05:38.417 回答
1

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

于 2013-10-10T15:06:14.453 回答