单击按钮时,程序会冻结。 我试图在根目录的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将启动,但参数不会传递给它。
答案 0 :(得分: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
。
答案 1 :(得分:2)
此行将使您的程序挂起:
proc.WaitForExit();
您将永远无法访问消息框,因为应用程序正在等待您的进程退出。只需删除proc.WaitForExit(),您的消息将在进程仍在后台运行时显示。但是,如果你这样做,你必须确保一切都得到妥善处理(即当你的申请关闭时,过程就会消失)
答案 2 :(得分:1)
According to MSDN,WaitForExit
等待关联进程退出,阻止当前执行线程,直到时间结束或进程退出。 '当前线程'是你发起它的线程;在这种情况下,你的主程序,导致你的挂起。