【发布时间】:2010-10-23 10:03:57
【问题描述】:
我正在尝试构建几个 Windows 服务来做不同的事情。例如,我需要以下 Windows 服务:
- 通过电子邮件发送每日报告
- 每隔 30 分钟定期清理一些存档信息
- 等
我需要 Windows 服务来完成的任务是不同的,所以我不太喜欢将它们全部放在一个服务中的想法。
到目前为止,我得到的是 Visual Studio 2008 中的一个项目。我创建了一个 Windows 服务,我在 OnStart 事件上设置了一个计时器(它只是每 5 秒写入一个文本文件以进行测试目的)。然后我在项目中添加了一个安装程序,当我运行 InstallUtil.exe 时,一切正常。
当我向同一个项目添加第二个 Windows 服务时,问题就出现了。我再次设置了 OnStart 代码,使用相同的日志记录信息(略有不同,因此我可以知道哪个服务正在写入日志)。使用第二个 Windows 服务,我将 Program.cs 中的 Main 事件从:
static void Main(string[] args)
{
ServiceBase[] ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
}
到:
static void Main(string[] args)
{
ServiceBase[] ServicesToRun = new ServiceBase[]
{
new Service1(),
new Service2()
};
ServiceBase.Run(ServicesToRun);
}
此时,没有编译时错误,但 Service2 服务从不做任何事情......日志记录任务永远不会触发。
我将其缩小到第二个服务没有与之关联的“安装程序”这一事实。然后我尝试像使用第一个服务一样添加安装程序(即,右键单击服务设计器,然后单击“添加安装程序”)。现在,当我转到 ProjectInstaller.cs 文件时,那里还有另一个 serviceInstaller (serviceInstaller2)。
现在,当我构建项目并尝试安装服务时,我转到“服务”控制面板窗口,尝试启动 Service1,我收到以下错误消息:
Windows 无法在本地计算机上启动 Service1 服务。
错误 1083:配置此服务运行的可执行程序未实现该服务。
如果我也尝试启动 Service2,我也会收到相同的错误消息(当然,错误消息标识 Service2 除外)。
为了让两个服务从一个 exe 运行,我有什么遗漏吗?
【问题讨论】:
-
除了“我想”之外,还有什么特殊原因需要您将服务放在一个可执行文件中吗?通常,模块化会更可取,但您可能会遇到需要其他情况的情有可原的情况。
-
唯一真正的原因是易于安装和部署。所有的“服务”都是相当快的一项功能,所以我不希望为一小段代码安装 x 个 Windows 服务。
-
@pyrochild -- 我相信在一个程序集中安装多个服务的原因有很多。我现在工作的地方,我们在每个客户的基础上使用这种设计的野兽——它使与这些服务交互的测试软件变得轻而易举。
标签: c# windows windows-services