开发c#长期运行处理器应用程序的最佳方法

时间:2008-09-30 21:12:45

标签: background long-integer task worker runner

我有几个不同的c#worker应用程序,它们运行各种连续任务:从队列发送电子邮件,从网站数据库导入新订单到订单数据库,进行数据库备份和恢复,运行OLTP的数据处理 - > OLAP和其他相关任务。之前,我发布了这些作为Windows服务,但目前我将它们作为常规控制台应用程序发布。它们都基于我创建的常见任务运行器框架,我很满意,但我不确定部署这些类型的应用程序的最佳方法是什么。我喜欢控制台版本,因为它快速而简单,并且可以快速查看程序活动和输出。缺点是工作者计算机有几个控制台屏幕运行,它变得混乱。另一方面,服务方法似乎需要很长时间才能部署,我必须通过事件日志来查看消息。对此有哪些经验/评论?

8 个答案:

答案 0 :(得分:2)

我喜欢控制台应用程序方法。我通常会设置一些东西,所以我可以通过一个像无人值守的开关来抑制控制台屏幕。

答案 1 :(得分:1)

Windows服务将是一个不错的选择,无论您是否关闭当前会话,它都会在后台运行,您也可以将其配置为在Windows重新启动后在服务器上执行修补程序更新时自动启动。您可以将重要消息记录到事件查看器或数据库表中。

答案 2 :(得分:1)

对于这样的事情,标准的方法是使用Windows服务。您希望服务在网络帐户上运行,因此不需要登录用户。

答案 3 :(得分:1)

几年前我曾做过类似问题的事情。从逻辑上讲,我需要一项服务,但有时我需要看看发生了什么,一般我想要一段历史。因此,我开发了一项服务来完成工作,无论何时想要记录,它都会调用它的订阅者(作为观察者模式实现)。

该服务注册了它自己的数据记录器(写入数据库),在运行时,用户可以使用远程操作连接到服务的GUI,成为一个实时监听器!

答案 4 :(得分:1)

我要投票支持Windows服务。管理这些控制台应用程序真的很痛苦。

Windows服务部署很简单:在初始安装之后,您只需关闭它们并执行XCOPY。无需运行任何复杂的安装程序。它第一次只是半复杂的,即便如此,它只是

installutil MyApp.exe

将服务配置为在域帐户下运行,以获得最佳安全性,并最简单地与其他计算机互操作。

对重要通知使用事件日志(包含错误,警告和信息)的组合,并将详细日志记录转储到文本文件。

答案 5 :(得分:1)

为什么不能充分利用所有世界并使用类似的东西:
http://topshelf-project.com/

它允许您将程序作为命令行或Windows服务运行。

答案 6 :(得分:0)

我不确定这是否适用于您的应用程序,但是当我有一些不依赖于用户输入的控制台应用程序或者它们是那些只是完成工作并退出的应用程序时,我会运行这样的程序在虚拟服务器上,这样我工作时看不到弹出的屏幕,虚拟服务器很容易创建和重启。

答案 7 :(得分:0)

我们经常使用Windows服务作为后台进程。我不喜欢命令行应用程序,因为您需要登录服务器才能运行它们。服务一直在后台运行(假设它们是自动启动)。使用Windows中的sc.exe命令行工具安装它们也很简单。我喜欢它比installutil.exe的膨胀软件更好。当然,installutil做得更多,但我不需要它做什么。我只是想注册我的服务。

我们还创建了一个基础架构,我们有一个基于接口定义加载.DLL的通用服务.exe,因此添加新的“服务”就像放入新的DLL并重新启动服务主机一样简单。

然而,我们开始摆脱服务。我们遇到的问题是它们锁定了DLL(出于显而易见的原因),因此升级它们很痛苦。我们需要停止,升级然后重新启动。不难,但还有其他步骤。相反,我们正在移动到我们的asp.net应用程序中的特殊“页面”,这些应用程序运行我们需要完成的实际后台作业。还有一项服务,但是所有它都会调用asp.net页面,所以它不会锁定我们的任何DLL。然后我们可以替换asp.net bin目录中的DLL和普通的asp.net规则,以便app-domain重启。