我在C#中创建了一个Windows窗体应用程序,并在其上添加了一个窗口服务。问题是我每次安装服务后都启动了服务,我总是得到Error 1053 the service did not respond to the start or control request
。但是在创建一个新项目并选择Windows服务并安装并运行它之后,没有错误,服务正在正确启动。
所以我必须为Windows服务创建一个单独的项目,否则我只是遗漏了一些东西?
我的目标框架是4.5.2,我计划在我的Windows服务中使用UDP和TCP功能。
答案 0 :(得分:2)
从Main()调用ServiceBase.Run()是使应用程序成为服务而不是普通应用程序的原因。如果使用Windows服务模板创建项目,但是取消了对ServiceBase.Run()的调用,则结果将是普通应用程序而不是服务。 (可能是已损坏的应用程序,但仍然是应用程序。)
引擎盖下,ServiceBase.Run()调用StartServiceCtrlDispatcher(),它调用内部ServiceBase.ServiceMainCallback()函数,该函数调用OnStart()函数。因此,如果您不调用Run(),则不会调用OnStart(),您的服务也无法执行任何操作。
StartServiceCtrlDispatcher()函数还间接负责调用OnStop()和所有其他相关方法。基本上,它是服务的核心,没有它就没有任何作用。当然,如果你不打电话给它,Windows最终会注意到控制调度程序还没有启动,假设进程已挂起并将其终止。那是1053的错误意味着什么。
虽然 可以将服务和应用程序合并到一个可执行文件中,但让它正常工作并不是一件容易的事。这也是一种不常见的方法,并不经常使用。除非您有令人信服的理由避免这样做,否则我建议您使用单独的项目进行服务。