You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:48:05