2010-12-23 146 views
3

我已经构建了一个Windows服务,每隔30分钟在C#中发送一次电子邮件。服务启动模式设置为自动。但仍然窗户不会自动启动。我需要手动启动Services.msc并右键单击服务并选择启动安装后Windows Service无法启动

+1

该服务在哪个帐户下运行? – 2010-12-23 15:35:19

+1

您的意思是*您重新启动计算机以完成安装后? – 2010-12-23 15:36:01

回答

5

当StartMode设置为自动时,这意味着它将在Windows启动时启动。

您可以在安装程序的自定义操作中自行启动服务。我假设你已经有一个安装程序类,并且它已经是你的安装项目的一个自定义动作,因为该服务正在安装,但并未启动。

覆盖在你安装程序类的OnAfterInstall方法,你可以启动该服务是这样的:

protected override void OnAfterInstall(IDictionary savedState) { 
    base.OnAfterInstall(savedState); 

    ServiceController sc = new ServiceController(“MyServiceName”); 
    sc.Start(); 
} 

然而,计划的任务是不是一个坏的路要走。

0

您是否使用installutil安装它?你是对的,它不启动服务,即使它被设置为自动。如果我是你,我会提供一个调用installutil的批处理文件,然后运行'net start whatever'。或者如果您使用其他类型的安装,那么也应该提供这种功能。

4

为什么要让自己度过所有开销和苦难的故障排除和维护基于时间/轮询应用程序的Windows服务? Windows操作系统内置了对此的支持。只需创建一个简单的控制台应用将其作为计划任务运行。

您应该已经有单元测试和解耦以使代码单元可测试。如果你不解决你的问题太困难了。一旦你用这种单元测试格式的代码翻转到一个控制台应用程序是一个明智的选择。

我知道一个人把所有东西都变成了windows服务并标记为SOA。为查询/基于时间的机制堆放windows服务不是SOA。它与控制台应用程序相比如此sl and,更难维护,我甚至无法表达它是多么糟糕的想法。我必须处理大约20-30个这样的服务,一旦他们转换为n层和一个控制台应用程序,突然间,应用程序的稳定性经历了屋顶,我的生活变得轻松了10倍。所以,请你帮个忙,听听经历了几个月的人以及这些类型的应用程序的许多迭代。在控制台应用程序中将其作为计划任务运行。

+2

是的,Windows服务是一种痛苦。当你忙于编写这些技术性的东西时,它确实感觉像是你的摇滚明星开发者,但他们几乎不可能调试并采取多个步骤来配置和部署新版本。如上所述,计划任务远远优于任务。 – rtpHarry 2010-12-23 15:54:10

2

自动启动服务会遇到服务初始化顺序问题。例如,在尝试发送电子邮件之前,您有很多依赖关系,TCP/IP堆栈最好处于正常工作状态。查看Windows事件日志中是否有阻止OnStart()获取服务启动的异常消息。

这可以针对服务进行配置,例如查看Print Spooler服务的Dependencies选项卡。然而,这很难处理,很难确切知道哪些服务需要运行难以编写配置依赖关系的注册表项。

解决问题:不要马上发送电子邮件。等一会,例如30分钟。