单击按钮后程序冻结
本文关键字:冻结 程序 按钮 单击 | 更新日期: 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
等待关联的进程退出,并阻止当前的执行线程,直到时间过去或进程退出。 "当前线程"是您从中启动它的线程;在这种情况下,您的主程序会导致您的挂起。