"始终运行"控制台应用

时间:2015-04-14 01:44:26

标签: c# scheduled-tasks

我编写了一个当前在服务器上运行的控制台应用程序。它不需要任何用户输入(除了可以通过启动参数完成的启动参数)。

不幸的是,这个解决方案很糟糕,因为有人可能会意外关闭它(即使用远程桌面连接连接到服务器然后注销而只是断开连接)。我需要它一直运行。

一种解决方案是将其转换为Windows服务,但到目前为止使用SC或第三方工具(如nssm或RunAsService)失败(SC和Nssm创建服务但无法启动此类服务)。

我可以完全重写我的程序,使其成为一项合适的服务......但说实话,我正在努力解决这个问题(从我读过的不推荐的做法)。

最后我可以将它作为控制台应用程序并使用任务调度程序来运行它 - 它看起来像一个不错的解决方案,但是(就像我提到的那样)我需要它一直运行(它可以关闭并且 - 非常短的停机时间不是问题。)

我可以请求任何有关设置此类任务的帮助吗?

解决

经过几次尝试后,我使用Topshelfthis great guide将其投入使用。

3 个答案:

答案 0 :(得分:2)

您可以使用两种方法在Windows中不断运行.net程序。两者都有优点和缺点。

Windows服务

  • 推荐的解决方案
  • 计算机上的启动服务是否启动(不需要有人登录)
  • 以重新启动的形式进行一些(有限的)错误处理
  • 适用于可以长时间运行的非常可靠的服务
  • 服务处理自己的状态
  • 由于内存泄漏而容易崩溃

IIS应用程序服务器

  • 不推荐的解决方案
  • 从Windows开始,但可能无法启动您的应用程序
  • 需要更新的窗口以允许始终进行配置
  • 始终在配置上很复杂
  • 状态由IIS处理
  • 对于糟糕的编程有更好的弹性,因为IIS会为你重新启动
  • IIS也可能会为您杀死您的线程(因此您的调度程序将停止工作)

我怀疑你被告知不建议使用Windows服务的原因是因为它可能因内存泄漏而崩溃。但无论如何都会出现这个问题,因为你的程序需要运行很长时间(这不是windows服务的问题,而是长期存在的进程)。

答案 1 :(得分:0)

编写功能性Windows服务需要遵循许多规则,包括但不限于

  • 在特定时间内完成初始化过程的能力
  • 对线程的一般理解

编写Windows服务并没有什么本质上的坏处,他们只需要更多的努力和安装程序。

根据您的描述,预定作业似乎符合您的要求

答案 2 :(得分:0)

如果您不想将您的控制台应用程序重新编写到Windows服务中并希望它一直在运行,那么我能看到的唯一解决方案是:

  • 创建一个小窗口的服务,检查您的控制台进程是否正在运行。

  • 如果发现没有Console进程,则启动一个新进程。

    Process[] pname = Process.GetProcessesByName("YourConsoleApp.exe");
    if (pname.Length == 0)
       Process.Start("YourConsole.exe")
    else
        //Do nothing