C# 实现外部程序启动与控制

需积分: 9 6 下载量 186 浏览量 更新于2024-09-11 收藏 343KB PDF 举报
"这篇资源主要介绍了C#编程中如何启动并控制外部程序的执行,包括不等待、等待、无限等待以及通过事件监听程序退出的四种方法。" 在C#编程中,启动和管理外部程序是常见的操作,尤其在需要与其他应用程序进行交互或自动化任务时。以下是对四种不同启动外部程序方法的详细解释: 1. 启动外部程序,不等待其退出: 在这段代码中,`Process.Start(appName)` 方法用于启动指定的外部程序(如 `calc.exe`)。此方法立即返回,不会阻塞调用线程,因此主程序会继续执行下一行代码,不会等待外部程序结束。`MessageBox.Show` 提示用户程序已启动。 ```csharp private void button1_Click(object sender, EventArgs e) { Process.Start(appName); MessageBox.Show(String.Format("外部程序{0}启动完成!", this.appName), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); } ``` 2. 启动外部程序,等待其退出: 使用 `Process.Start` 启动程序后,可以调用 `WaitForExit` 方法来使当前线程等待直到进程结束。在这里,我们设置了3秒钟的超时时间(`3000` 毫秒),如果外部程序在3秒内未退出,`WaitForExit` 将返回,然后检查 `HasExited` 属性来判断程序是否已经结束。如果程序未结束,则会调用 `Kill` 方法强制结束。 ```csharp private void button2_Click(object sender, EventArgs e) { try { Process proc = Process.Start(appName); if (proc != null) { proc.WaitForExit(3000); if (proc.HasExited) MessageBox.Show(String.Format("外部程序{0}已经退出!", this.appName), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); else { proc.Kill(); MessageBox.Show(String.Format("外部程序{0}被强行终止!", this.appName), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } catch (ArgumentException ex) { MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } } ``` 3. 启动外部程序,无限等待其退出: 如果希望程序完全等待外部程序结束再继续执行,可以省略 `WaitForExit` 的超时参数,使其无限等待,直到外部程序结束。这样可以确保程序执行顺序,但可能会阻塞当前线程。 ```csharp private void button3_Click(object sender, EventArgs e) { Process proc = Process.Start(appName); proc.WaitForExit(); // 无限等待直到进程结束 MessageBox.Show(String.Format("外部程序{0}已经退出!", this.appName), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); } ``` 4. 启动外部程序,通过事件监视其退出: 可以订阅 `Process.Exited` 事件来监视外部程序的退出,当外部程序结束时,事件处理器将被调用。这种方法更适用于需要在程序退出时执行特定操作的情况。 ```csharp private Process proc; private void button4_Click(object sender, EventArgs e) { proc = Process.Start(appName); proc.Exited += new EventHandler(proc_Exited); } private void proc_Exited(object sender, EventArgs e) { MessageBox.Show(String.Format("外部程序{0}已经退出!", this.appName), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); } ``` 以上四种方法可以根据实际需求选择使用,例如,如果你只是简单地启动一个程序并希望立即继续执行其他代码,可以选择不等待退出的方法;如果需要确保外部程序执行完毕后再进行下一步操作,则应等待其退出。而在某些情况下,监听程序退出事件可以提供更灵活的控制。