WinForms程序异步等待Steam游戏启动并关闭后执行后续操作的实现方案咨询
WinForms程序异步等待Steam游戏启动并关闭后执行后续操作的实现方案咨询
嘿,我来帮你搞定这个需求!你想要的是WinForms程序启动Steam游戏后,既能等着游戏完全启动并关闭,又不卡界面,对吧?这核心就是用异步操作避免阻塞UI线程,同时要正确跟踪Steam拉起的游戏进程——毕竟直接启动steam://协议的话,我们拿到的不是游戏进程本身,而是Steam的启动进程,所以得额外找游戏进程。
下面给你一套可行的实现步骤和代码:
第一步:把启动方法改成异步的
别用同步的void方法,改成async Task类型,调用的时候用await就能让UI保持响应。
第二步:启动Steam游戏后,轮询找到游戏进程
Steam通过协议启动游戏后,会自己拉起游戏的独立进程,所以我们需要按游戏的进程名去查找(你可以打开任务管理器,运行游戏后看它的进程名是什么)。这里加个延迟和轮询,确保能等到Steam把游戏进程拉起来。
第三步:异步等待游戏进程退出
找到进程后,用异步的方式等它退出,绝对不能用同步的WaitForExit(),不然界面直接卡死。
完整代码示例
async Task LaunchAndWaitForSteamGameAsync() { try { // 启动指定ID的Steam游戏 Process.Start(new ProcessStartInfo { FileName = "steam://rungameid/1086940" }); // 先等2秒,给Steam一点拉起游戏的时间(时间可以根据实际情况调整) await Task.Delay(2000); Process gameProcess = null; // 轮询查找游戏进程,替换成你实际的游戏进程名 var targetProcessName = "YourGameProcessName"; while (gameProcess == null) { // 忽略大小写查找进程 gameProcess = Process.GetProcesses() .FirstOrDefault(p => p.ProcessName.Equals(targetProcessName, StringComparison.OrdinalIgnoreCase)); if (gameProcess == null) { // 没找到就等1秒再查,别占太多CPU await Task.Delay(1000); } } // 异步等待游戏进程退出(.NET 5+/.NET Core 3.0+支持这个方法) await gameProcess.WaitForExitAsync(); // 游戏关闭后,执行你要做的后续操作 MessageBox.Show("游戏已经关闭啦!现在可以执行后续逻辑咯~"); // 这里写你的后续代码,比如清理临时文件、更新界面状态等 } catch (Exception ex) { // 处理各种异常情况,比如Steam没安装、游戏不存在、进程查找失败等 MessageBox.Show($"操作出错啦:{ex.Message}"); } }
针对.NET Framework 4.x的兼容处理
如果你用的是老版本的.NET Framework,没有WaitForExitAsync()方法,可以自己写一个异步等待的辅助方法:
async Task WaitForProcessExitAsync(Process process) { var completionSource = new TaskCompletionSource<bool>(); process.EnableRaisingEvents = true; process.Exited += (sender, e) => completionSource.TrySetResult(true); await completionSource.Task; }
然后把代码里的await gameProcess.WaitForExitAsync();换成await WaitForProcessExitAsync(gameProcess);就行。
几个注意点
- 一定要替换
targetProcessName为你游戏实际的进程名,不然找不到进程会一直轮询哦。 - 延迟时间可以根据游戏启动速度调整,要是游戏启动慢,就把初始的2秒延迟调长一点。
- 绝对不要在UI线程上用同步等待的方法(比如
gameProcess.WaitForExit()),那样会直接锁死界面,用户体验极差。
备注:内容来源于stack exchange,提问作者Aergernis
相关产品推荐
相关产品推荐

