我有一个调用外部exe文件的方法。
private void MainTask()
{
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "test.exe";
process.StartInfo = startInfo;
process.Start();
}
运行test.exe文件可能需要10-50-150秒。问题是如何检查它的执行位置或仍在运行。
我试图像这样实现backgroundWorker:
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
MainTask();
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
pictureBoxOutput.Image =
MessageBox.Show("C Sharp is awesome.");
}
是否可以检查方法何时完全执行?因为现在我收到一条消息“C Sharp很棒。”即使进程仍在运行。
编辑:我想创建一个进度条,我需要在流程完成后更新表单上的几个元素。进程创建新文件,我需要显示新文件的名称。当然它应该先完成,否则应用程序将崩溃
答案 0 :(得分:0)
您需要致电process.WaitForExit()
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "test.exe";
process.StartInfo = startInfo;
process.Start();
process.WaitForExit(); // this will block while the process is running
答案 1 :(得分:0)
这一切都归结为在程序完成后有一个回调函数。有两种方法:
注册流程类Exited Event。
如果你想保留当前的BackgroundWorker代码,你必须在BackgroundWorker中添加一个“等待进程完成你继续”的调用,正如Mihail Shishkov在他的回答中所示。
< / LI> 醇>Process.Start()不会等待进程退出。它会立即继续。有效使用Process.Start()与点击Windows运行对话框上的“确定”按钮相同。无论程序从那时开始做什么,您的代码都会立即继续。在大多数情况下,您甚至可以在调用start后立即使用对流程实例的引用超出范围。
答案 2 :(得分:0)
您可以使用Exited event
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "test.exe";
process.StartInfo = startInfo;
process.Exited += (sender, e) => {
pictureBoxOutput.Image = ...;
MessageBox.Show("C Sharp is awesome.");
};
process.Start();