开发C#长时间运行的处理器应用程序的最佳方法
我有几个不同的cworker应用程序,它们运行各种连续的任务:从队列发送电子邮件,将新订单从网站数据库导入到订单数据库,进行数据库备份和还原,为OLTP-> OLAP运行数据处理以及其他相关任务。以前,我将它们作为Windows服务发布,但是目前我将它们作为常规控制台应用程序发布。它们全部基于我创建的通用任务运行器框架,对此我感到满意,但是我不确定部署这些类型的应用程序的最佳方法是什么。我喜欢控制台版本,因为它既快速又容易,并且可以快速查看程序活动和输出。缺点是工作计算机正在运行多个控制台屏幕,并且变得混乱。另一方面,服务方法似乎需要花费很长时间才能部署,因此我必须浏览事件日志才能看到消息。有什么经验/评论吗?
解决方案
我喜欢控制台应用程序方法。通常,我已经进行了一些设置,因此我可以通过-unattended这样的开关来抑制控制台屏幕。
Windows Service是一个不错的选择,无论我们是否关闭当前会话,它都可以在后台运行,也可以将其配置为在服务器上执行修补程序更新时,在Windows重新启动后自动启动。我们可以将重要消息记录到事件查看器或者数据库表中。
对于这样的事情,标准的做法是使用Windows服务。我们希望该服务在网络帐户上运行,以便不需要登录用户。
几年前,我从事过类似问题的研究。从逻辑上讲,我需要一项服务,但是有时我需要查看发生了什么,并且通常我想要一个历史记录。因此,我开发了一个服务来完成这项工作,只要它想登录,就调用它的订阅者(以观察者模式实现)。
该服务注册了自己的数据记录器(写入数据库),并且在运行时,用户可以运行通过远程连接到该服务的GUI,从而成为实时监听器!
我将为Windows服务投票。管理那些控制台应用程序将是一个真正的痛苦。
Windows Service的部署很容易:初始安装后,只需关闭它们并执行XCOPY。无需运行任何复杂的安装程序。第一次只是半复杂,即使那样
installutil MyApp.exe
将服务配置为在域帐户下运行,以实现最佳安全性和与其他计算机的最轻松互操作。
结合使用事件日志(带有错误,警告和信息)来获取重要的通知,然后将详细的日志记录转储到文本文件中。
我不确定这是否适用于应用程序,但是当我有一些不依赖用户输入的控制台应用程序或者它们只是执行工作并退出的那种应用程序时,我会在虚拟机上运行此类程序服务器,这样我在工作时不会弹出屏幕,并且易于创建和重新启动虚拟服务器。
我们定期使用Windows服务作为后台进程。我不喜欢命令行应用程序,因为我们需要登录到服务器才能运行它们。服务始终在后台运行(假设它们是自动启动的)。使用Windows中的sc.exe命令行工具安装它们也很简单。我喜欢它比installutil.exe这样的膨胀软件更好。当然,installutil的作用还更多,但我不需要它的作用。我只想注册我的服务。
我们还创建了一个基础结构,在该基础结构中,我们有一个基于接口定义加载.DLL的通用服务.exe,因此添加新的"服务"就像插入新的DLL并重新启动服务主机一样简单。
但是,我们开始远离服务。我们遇到的问题是它们锁定了DLL(出于明显的原因),因此升级它们很麻烦。我们需要停止,升级然后重新启动。不难,但需要额外的步骤。相反,我们将在asp.net应用程序中转到特殊的"页面",这些页面运行我们需要完成的实际后台作业。仍然有一项服务,但是它所做的全部都会调用asp.net页面,因此它不会锁定我们的任何DLL。然后,我们可以替换asp.net bin目录中的DLL和用于应用程序域重新启动的常规asp.net规则。