C# &引用;“始终运行”;控制台应用程序

C# &引用;“始终运行”;控制台应用程序,c#,scheduled-tasks,C#,Scheduled Tasks,我编写了一个当前正在服务器上运行的控制台应用程序。它不需要任何用户输入(启动时的参数除外,可以通过启动参数完成) 不幸的是,此解决方案很糟糕,因为有人可能会意外地将其关闭(即,使用远程桌面连接连接到服务器,然后注销,而不是简单地断开连接)。我需要它一直运行 一种解决方案是将其转换为windows服务,但到目前为止,使用SC或第三方工具(如nssm或RunAsService)失败(SC和nssm创建了一个服务,但无法启动此类服务) 我可以完全重写我的程序成为一个合适的服务。。。但老实说,我正在与之

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

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

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

我可以完全重写我的程序成为一个合适的服务。。。但老实说,我正在与之抗争(从我读到的不推荐的实践来看)

最后,我可以将它作为一个控制台应用程序,并使用任务调度程序来运行它-这看起来确实是一个不错的解决方案,但(正如我所提到的)我需要它一直运行(它可以关闭和打开-非常短的停机时间不是问题)

我能在设置这样的任务时寻求帮助吗

解决


经过几次尝试,我已经使用和将其转换为服务。

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

  • 在特定时间内完成初始化过程的能力
  • 对线程的一般理解
编写一个windows服务本身并没有什么不好的,只是需要更多的努力和一个安装程序


根据您的描述,计划作业似乎符合您的要求

如果您不想将console应用程序重新写入windows服务并希望它一直运行,我能看到的唯一解决方案是:

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

  • 如果发现没有控制台进程,则启动一个新进程

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

    • 有两种方法可用于在windows中持续运行.net程序。两者都有优点和缺点

      Windows服务

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

      • 不推荐的解决方案
      • 使用windows启动,但可能无法启动应用程序
      • 需要更新的windows以允许始终打开配置
      • 始终在线的配置很复杂
      • 状态由IIS处理
      • 对糟糕编程的恢复能力要好得多,因为IIS将为您重新启动
      • IIS还可能为您终止线程(因此您的调度程序将停止工作)

      我怀疑您被告知不推荐windows服务的原因是因为它可能由于内存泄漏而崩溃。但是,无论发生什么情况,这个问题都会发生,因为您的程序需要运行很长时间(这不是windows服务的问题,而是长期存在的进程的问题)。

      您读到什么文章认为使用服务是个坏主意?这似乎是你的完美解决方案。服务可以在出现故障时重新启动,这非常有用。您可能想看看优秀的TopShelf开放源代码库,该库将程序集作为服务托管。创建一个可以自行安装和卸载的服务非常容易,包括帐户运行的选项等。是的,将其作为服务编写。在没有必要的情况下,你试图在这里重新发明轮子。我强烈建议不要设计一个Rube Goldberg解决方案,因为有一个非常好的、直接的方法来解决完全相同的问题。@DanielMann是的,这可能是一个“坏”的解决方案。然而,在为自己设计出一个合适的设计模式之前,您必须编写一些反模式。有时,可能需要适应不太好的解决方案,以避免一开始就不需要的过于好的设计工程解决方案的复杂性。这也是我最初的想法,因为我并不真的想太多地干扰代码,但实际上这不是一个好的解决方案。因此,我的想法和我的想法一样:如果创建了windows服务,就不需要控制台应用程序了!Linux上称为守护进程的服务