WPF C# 启动外部应用后如何等待其关闭再执行后续逻辑?
问题根因
你在WPF UI线程同步调用WaitForExit()方法时,会阻塞UI线程的消息循环,一方面会导致界面无响应,另一方面在UseShellExecute = true的场景下,内部逻辑依赖消息泵调度,会出现等待逻辑异常,表现为没有等待进程退出就直接执行后续代码。控制台应用没有WPF的UI消息循环机制,所以同步调用可以正常运行。
解决方案
推荐使用异步方式等待进程退出,既不会阻塞UI,也能保证执行顺序符合预期,以下是两种适用不同框架版本的实现:
方案1:适用于.NET 5+ 版本
框架自带WaitForExitAsync异步API,写法更简洁:
private static async Task<int> OpenApplicationAsync(string applicationName) { try { ProcessStartInfo psi = new ProcessStartInfo { FileName = applicationName, WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = true, }; using Process p = Process.Start(psi); if (p != null) { await p.WaitForExitAsync(); return p.ExitCode == 0 ? 0 : 1; } } catch (Win32Exception ex) { MessageBox.Show(ex.Message); } return 1; }
修改按钮点击事件为异步事件处理器:
private async void Button_Click(object sender, RoutedEventArgs e) { // 点击后禁用按钮避免重复触发 (sender as Button).IsEnabled = false; msg.Content = "Waiting"; var exitResult = await OpenApplicationAsync("applicationFileName"); if (exitResult == 0) { msg.Content = "Exited"; } else { msg.Content = "启动失败或进程退出码非0"; } // 恢复按钮可用状态 (sender as Button).IsEnabled = true; }
方案2:适用于.NET Framework 版本
没有内置异步等待API,可以通过进程Exited事件实现异步等待:
private static Task<int> OpenApplicationAsync(string applicationName) { var tcs = new TaskCompletionSource<int>(); try { ProcessStartInfo psi = new ProcessStartInfo { FileName = applicationName, WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = true, }; Process p = new Process { StartInfo = psi, EnableRaisingEvents = true }; p.Exited += (s, args) => { int code = p.ExitCode; p.Dispose(); tcs.SetResult(code == 0 ? 0 : 1); }; if (!p.Start()) { p.Dispose(); tcs.SetResult(1); } } catch (Win32Exception ex) { MessageBox.Show(ex.Message); tcs.SetResult(1); } return tcs.Task; }
按钮点击事件的写法和方案1完全一致,无需修改。
注意事项
- 如果修改后仍然出现不等待的情况,优先排查你启动的目标应用是否为单实例程序:如果已经有对应进程在运行,新启动的进程会直接退出并通知已有实例显示窗口,此时你拿到的进程对象会直接触发退出逻辑,需要针对单实例进程做额外的运行状态判断。
- 如果你启动的是关联程序打开的非exe文件,
UseShellExecute = true场景下拿到的进程对象可能不是实际打开文件的主进程,可以改为UseShellExecute = false,直接指定对应exe路径,把要打开的文件作为Arguments参数传入即可。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

