【发布时间】:2013-09-05 02:51:40
【问题描述】:
我有一个 .Net 控制台应用程序,它将使用预定事件启动,调用 mweb 服务方法并关闭。每小时/每天运行一次。虽然实现没有任何“错误”,但我想知道将其实现为 Windows 服务是否有任何好处。
有没有人认为在这种情况下最佳做法是什么?
【问题讨论】:
标签: .net
我有一个 .Net 控制台应用程序,它将使用预定事件启动,调用 mweb 服务方法并关闭。每小时/每天运行一次。虽然实现没有任何“错误”,但我想知道将其实现为 Windows 服务是否有任何好处。
有没有人认为在这种情况下最佳做法是什么?
【问题讨论】:
标签: .net
我发现 Windows 服务很难调试,所以我倾向于只在以下情况下使用它们:
(A) 我正在做的事情相当复杂或
(B) 需要一直运行(例如:监控某些东西的变化)
我发现大多数事情通常可以通过控制台应用程序、一些命令行参数和 Windows 调度程序来完成。
【讨论】:
服务在三个方面不同于应用程序:
这里要问的问题是:您需要服务可以为您提供的不同选项吗?如果答案是否定的,那么不要使用服务。
我从您的问题推断出您需要一个没有任何用户界面的后台应用程序(上面的第 2 项)。您似乎不需要项目 1 或 3。您可以通过不创建一个没有任何窗口(控制台或其他)的纯后台应用程序。只需创建一个简单的 Windows 应用程序并进行更改
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
到
static class Program
{
[STAThread]
static void Main()
{
// Application.EnableVisualStyles();
// Application.SetCompatibleTextRenderingDefault(false);
// Application.Run(new Form1());
DoWhateverYouWant();
}
}
哦,是的,Chris 完全正确地认为调试服务真的很痛苦!
【讨论】:
我认为你所做的是最好的做法。没有什么比添加自己的服务只是为了定期做一些小事的应用程序更让我讨厌的了。随着 >Vista 中更新的事件日志/任务调度程序集成,真正需要服务的应用程序更少了,而且如果他们需要,就可以按需提供。
你正在让世界变得更美好。
:-)
哦,作为一个控制台应用程序,您可以在需要时轻松手动运行它,这对可调试性非常有用。
澄清:继续,你做对了。
【讨论】:
好处:如果您的机器重新启动(即服务器),您无需登录即可重新开始工作。
我同意调试 Windows 服务很糟糕!这太可怕了,MS 应该真正解决调试服务的能力。
但是...有一些免费软件工具可以极大地帮助该过程。 Anderson Imes 有一个很好的实用程序,它使编写 Windows 服务就像编写控制台应用程序一样,即使在调试周期中也是如此。
在http://theimes.com/files/查看他的服务调试实用程序
关于他的实现最好的部分是它是代码中的 1 行更改,如果您不希望在生产实例中使用他的库,您可以使用 #if DEBUG 参数轻松管理。
【讨论】:
调试服务有一个简单的解决方法。您创建了一个组合控制台/服务应用程序。
您检查一些命令行参数(例如 -debug),然后执行您的 OnStart 代码,等待按键,执行 OnStop 代码。
我使用相同的方法来提供一个界面来从同一个 EXE 安装、卸载、启动和停止我的服务。
【讨论】:
需要考虑的重要一点是控制台应用程序支持 System.Drawing 命名空间,这意味着您可以打印。它可以在 Windows 服务中使用,但不受支持且不完全稳定。
【讨论】:
Creego 的 2 分和 treb 的 3 分是不可否认的。但是,我发现 SQL Server Agent 05/08/R2 是一个非常可靠和有用的任务调度程序。它比 Windows 任务计划更可靠,您不必担心批处理权限或有用户登录。
我有一个后台系统程序,它通过 SQL Server 代理每 2 分钟运行一次。我强烈考虑将其转换为 Windows 服务,但我无法证明它的合理性。
不过,在另一种情况下,天平很容易倾斜。
【讨论】:
这不是你的问题,但我通常将这两种方法结合起来。
我使用控制台进行调试,并使用共享相同库和规则的 Windows 服务。
【讨论】: