C# &引用;“始终运行”;控制台应用程序
我编写了一个当前正在服务器上运行的控制台应用程序。它不需要任何用户输入(启动时的参数除外,可以通过启动参数完成) 不幸的是,此解决方案很糟糕,因为有人可能会意外地将其关闭(即,使用远程桌面连接连接到服务器,然后注销,而不是简单地断开连接)。我需要它一直运行 一种解决方案是将其转换为windows服务,但到目前为止,使用SC或第三方工具(如nssm或RunAsService)失败(SC和nssm创建了一个服务,但无法启动此类服务) 我可以完全重写我的程序成为一个合适的服务。。。但老实说,我正在与之抗争(从我读到的不推荐的实践来看) 最后,我可以将它作为一个控制台应用程序,并使用任务调度程序来运行它-这看起来确实是一个不错的解决方案,但(正如我所提到的)我需要它一直运行(它可以关闭和打开-非常短的停机时间不是问题) 我能在设置这样的任务时寻求帮助吗 解决C# &引用;“始终运行”;控制台应用程序,c#,scheduled-tasks,C#,Scheduled Tasks,我编写了一个当前正在服务器上运行的控制台应用程序。它不需要任何用户输入(启动时的参数除外,可以通过启动参数完成) 不幸的是,此解决方案很糟糕,因为有人可能会意外地将其关闭(即,使用远程桌面连接连接到服务器,然后注销,而不是简单地断开连接)。我需要它一直运行 一种解决方案是将其转换为windows服务,但到目前为止,使用SC或第三方工具(如nssm或RunAsService)失败(SC和nssm创建了一个服务,但无法启动此类服务) 我可以完全重写我的程序成为一个合适的服务。。。但老实说,我正在与之
经过几次尝试,我已经使用和将其转换为服务。编写功能性windows服务需要遵循许多规则,包括但不限于
- 在特定时间内完成初始化过程的能力
- 对线程的一般理解
根据您的描述,计划作业似乎符合您的要求如果您不想将console应用程序重新写入windows服务并希望它一直运行,我能看到的唯一解决方案是:
- 创建一个小窗口的服务,检查控制台进程是否正在运行
- 如果发现没有控制台进程,则启动一个新进程
Process[] pname = Process.GetProcessesByName("YourConsoleApp.exe"); if (pname.Length == 0) Process.Start("YourConsole.exe") else //Do nothing
- 推荐解决方案
- 计算机上的启动服务是否会启动(不需要有人登录)
- 以重新启动的形式进行一些(有限的)错误处理
- 适用于可以长时间运行的非常可靠的服务
- 服务处理自己的状态
- 很容易由于内存泄漏而崩溃
- 不推荐的解决方案
- 使用windows启动,但可能无法启动应用程序
- 需要更新的windows以允许始终打开配置
- 始终在线的配置很复杂
- 状态由IIS处理
- 对糟糕编程的恢复能力要好得多,因为IIS将为您重新启动
- IIS还可能为您终止线程(因此您的调度程序将停止工作)
- 有两种方法可用于在windows中持续运行.net程序。两者都有优点和缺点
Windows服务
我怀疑您被告知不推荐windows服务的原因是因为它可能由于内存泄漏而崩溃。但是,无论发生什么情况,这个问题都会发生,因为您的程序需要运行很长时间(这不是windows服务的问题,而是长期存在的进程的问题)。您读到什么文章认为使用服务是个坏主意?这似乎是你的完美解决方案。服务可以在出现故障时重新启动,这非常有用。您可能想看看优秀的TopShelf开放源代码库,该库将程序集作为服务托管。创建一个可以自行安装和卸载的服务非常容易,包括帐户运行的选项等。是的,将其作为服务编写。在没有必要的情况下,你试图在这里重新发明轮子。我强烈建议不要设计一个Rube Goldberg解决方案,因为有一个非常好的、直接的方法来解决完全相同的问题。@DanielMann是的,这可能是一个“坏”的解决方案。然而,在为自己设计出一个合适的设计模式之前,您必须编写一些反模式。有时,可能需要适应不太好的解决方案,以避免一开始就不需要的过于好的设计工程解决方案的复杂性。这也是我最初的想法,因为我并不真的想太多地干扰代码,但实际上这不是一个好的解决方案。因此,我的想法和我的想法一样:如果创建了windows服务,就不需要控制台应用程序了!Linux上称为守护进程的服务