C#service - OnStart()v构造函数

时间:2011-05-13 19:51:27

标签: c# .net service

我试图理解OnStart()ServiceBase派生类中的构造函数之间的区别。通过阅读它似乎是第一次启动服务(打开你的机器后),调用构造函数。此后,您可以根据需要多次停止和启动服务,但永远不会再次调用构造函数,每次只调用OnStart()方法。任何人都可以确认吗?

由于

3 个答案:

答案 0 :(得分:16)

不要使用构造函数来执行应该在OnStart中的处理。使用OnStart处理服务的所有初始化。构造函数在应用程序的可执行文件运行时调用,而不是在服务运行时调用。可执行文件在OnStart之前运行。例如,当您继续时,不会再次调用构造函数,因为SCM已将对象保存在内存中。如果OnStop释放在构造函数而不是OnStart中分配的资源,则第二次调用服务时将不会再次创建所需的资源。 MSDN

答案 1 :(得分:4)

一个轻微的变体是,它取决于它是否包含一个服务或多个服务。这是docs

中的一行
  

如果可执行文件包含单个   服务,系统调用   当Start是时,service的构造函数   从SCM中选择,然后运行   析构函数,如果调用了Stop。

     

如果可执行文件包含多个   服务,调用Start on one service   导致构造函数被调用   对于可执行文件中的所有服务,   但只有指定的服务   开始。服务的析构函数   所有服务都在一起运行   已经停止了,而不是单独停止   每个服务停止时。

但是oxilumin的回答可能就是你所追求的。

答案 2 :(得分:2)

是的,这是正确的。每个加载时调用一次构造函数,并在用户(或自动化)启动和停止服务时启动。