我已经构建了一个Windows服务,在C#中每30分钟发送一次电子邮件。服务启动模式设置为自动。但仍然无法自动启动Windows。我需要手动启动,转到Services.msc并右键单击该服务并选择开始
答案 0 :(得分:5)
当StartMode设置为自动时,这意味着它将在Windows启动时启动。
您可以在安装程序中的自定义操作中自行启动该服务。我假设您已经安装了一个Installer类,并且自安装该服务以来它已经是您的安装项目的自定义操作,但是没有启动。
覆盖您拥有的Installer类中的OnAfterInstall方法,您可以像这样启动服务:
protected override void OnAfterInstall(IDictionary savedState) {
base.OnAfterInstall(savedState);
ServiceController sc = new ServiceController(“MyServiceName”);
sc.Start();
}
但是,计划任务并不是一个糟糕的方法。
答案 1 :(得分:4)
为什么要让自己完成故障排除和维护基于时间/轮询应用程序的Windows服务的所有开销和痛苦? Windows操作系统内置了对此的支持。只需创建一个简单的控制台应用将其作为计划任务运行。
您应该已经进行了单元测试和解耦,以使代码可单元测试。如果不这样做,您的故障排除就太困难了。一旦你有了这个单元可测试格式的代码,翻转到控制台应用程序是没有道理的。
我认识一个让一切都成为Windows服务并将其标记为SOA的人。为基于轮询/时间的机制堆积Windows服务不是SOA。它与控制台应用程序相比如此草率,而且难以维护,我甚至无法开始表达它是多么糟糕的想法。我不得不处理大约20-30个这样的获胜服务,一旦它们被转换为n层和控制台应用程序突然之间,应用程序的稳定性经历了屋顶,我的生活变得轻松了10倍。所以,请帮自己一个忙,听听经历了几个月和这些类型的应用程序的多次迭代的人。在控制台应用程序中将其作为计划任务运行。
答案 2 :(得分:2)
自动启动服务会受到服务初始化顺序的影响。例如,在尝试发送电子邮件之前,您有很多依赖项,TCP / IP堆栈最好处于正常工作状态。在Windows事件日志中查找阻止OnStart()启动服务的异常消息。
可以为服务配置,例如,查看Print Spooler服务的Dependencies选项卡。但是这很难处理,很难确切地知道哪些服务需要运行并且很难编写配置依赖项的注册表项。
解决问题:不要立即发送电子邮件。等一会儿,例如30分钟。
答案 3 :(得分:0)
您使用installutil安装它吗?你是对的,它不会启动服务,即使它被设置为自动。如果我是你,我会提供一个调用installutil的批处理文件,然后运行'net start whatever'。或者如果你正在使用其他类型的安装,那些也应该提供这种能力。