2

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

4

8 回答 8

2

我喜欢控制台应用程序方法。我通常会设置一些东西,所以我可以传递一个像 -unattended 这样的开关来抑制控制台屏幕。

于 2008-09-30T21:16:21.190 回答
1

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

于 2008-09-30T21:19:20.153 回答
1

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

于 2008-09-30T21:25:20.263 回答
1

几年前,我从事过类似问题的工作。从逻辑上讲,我需要一项服务,但有时我需要查看正在发生的事情,通常我想要一个历史记录。所以我开发了一个服务来完成这项工作,只要它想记录,它就会调用它的订阅者(实现为观察者模式)。

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

于 2008-09-30T21:29:44.793 回答
1

我将投票支持 Windows 服务。管理这些控制台应用程序将变得非常痛苦。

Windows 服务部署很简单:初始安装后,您只需将其关闭并执行 XCOPY。无需运行任何复杂的安装程序。第一次只是半复杂的,即使那样也只是

installutil MyApp.exe

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

使用事件日志(带有错误、警告和信息)的组合来获取重要通知,并将详细日志记录转储到文本文件中。

于 2008-09-30T21:30:45.100 回答
1

为什么不获得世界上最好的并使用类似的东西:
http ://topshelf-project.com/

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

于 2011-11-03T18:23:36.810 回答
0

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

于 2009-02-20T20:44:34.963 回答
0

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

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

然而,我们开始远离服务。我们遇到的问题是它们锁定了 DLL(出于显而易见的原因),因此升级它们很痛苦。我们需要停止、升级然后重新启动。不难,但需要额外的步骤。相反,我们正在运行我们需要完成的实际后台作业的 asp.net 应用程序中的特殊“页面”。仍然有一项服务,但它所做的只是调用 asp.net 页面,因此它不会锁定我们的任何 DLL。然后我们可以替换 asp.net bin 目录中的 DLL 和正常的 asp.net 规则,以重新启动应用程序域。

于 2009-05-05T19:37:35.863 回答