【问题标题】:Checking if a console application is still running using the Process class使用 Process 类检查控制台应用程序是否仍在运行
【发布时间】:2011-01-02 19:48:34
【问题描述】:

我正在制作一个应用程序,它将监视另一个进程的状态,并在它停止响应、退出或抛出错误时重新启动它。 但是,我无法可靠地检查进程(作为 C++ 控制台窗口)是否已停止响应。

我的代码如下所示:

       public void monitorserver()
    {
        while (true)
        {
            server.StartInfo = new ProcessStartInfo(textbox_srcdsexe.Text, startstring);
            server.Start();
            log("server started");
            log("Monitor started.");
            while (server.Responding)
            {
                if (server.HasExited)
                {
                    log("server exitted, Restarting.");
                    break;
                }
                log("server is running: " + server.Responding.ToString());
                Thread.Sleep(1000);
            }
            log("Server stopped responding, terminating..");
            try
            { server.Kill(); }
            catch (Exception) { }
        }
    }

我正在监控的应用程序是 Valve 的 Source Dedicated Server,运行着 Garry 的 Mod,我对物理引擎施加了过大的压力来模拟它停止响应。 但是,这永远不会触发进程类将其识别为“停止响应”。

我知道有一些方法可以使用他们自己的协议直接查询源服务器,但我希望它保持简单和通用(以便将来我可以将它用于不同的应用程序)。

任何帮助表示赞赏

【问题讨论】:

  • +1 对于 SLaks,你能管理的最好的就是“它是在运行,还是已经停止?”。我会使用专有 api 来检查状态。

标签: c# .net process


【解决方案1】:

Responding property 指示进程是否正在运行未挂起的 Windows 消息循环
正如documentation 所说,

如果进程没有 MainWindowHandle,则该属性返回 true。

无法像您尝试的那样检查任意进程是否正在执行任意操作。

【讨论】:

  • 谢谢!不知道,在谷歌上找不到^^;下次一定更好看。如果控制台应用程序挂起,是否有另一种方法来检查它?感谢您的帮助 =)
  • @Ced:没有控制台进程被挂起的概念。一个控制台进程总是在做某事;它可能正在做一些允许它响应请求的事情。
  • @Ced:一点也不。没有办法指定循环,更不用说找到正确的循环或检查它是否在循环。
  • 好的,谢谢你的信息,我想我会使用 srcds 查询系统然后 =)
猜你喜欢
  • 1970-01-01
  • 2012-02-19
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多