我试图理解OnStart()
与ServiceBase
派生类中的构造函数之间的区别。通过阅读它似乎是第一次启动服务(打开你的机器后),调用构造函数。此后,您可以根据需要多次停止和启动服务,但永远不会再次调用构造函数,每次只调用OnStart()
方法。任何人都可以确认吗?
由于
答案 0 :(得分:16)
不要使用构造函数来执行应该在OnStart
中的处理。使用OnStart
处理服务的所有初始化。构造函数在应用程序的可执行文件运行时调用,而不是在服务运行时调用。可执行文件在OnStart
之前运行。例如,当您继续时,不会再次调用构造函数,因为SCM
已将对象保存在内存中。如果OnStop
释放在构造函数而不是OnStart
中分配的资源,则第二次调用服务时将不会再次创建所需的资源。
MSDN
答案 1 :(得分:4)
一个轻微的变体是,它取决于它是否包含一个服务或多个服务。这是docs
中的一行如果可执行文件包含单个 服务,系统调用 当Start是时,service的构造函数 从SCM中选择,然后运行 析构函数,如果调用了Stop。
如果可执行文件包含多个 服务,调用Start on one service 导致构造函数被调用 对于可执行文件中的所有服务, 但只有指定的服务 开始。服务的析构函数 所有服务都在一起运行 已经停止了,而不是单独停止 每个服务停止时。
但是oxilumin的回答可能就是你所追求的。
答案 2 :(得分:2)
是的,这是正确的。每个加载时调用一次构造函数,并在用户(或自动化)启动和停止服务时启动。