错误1053:Windows服务无法及时启动
我已经按照无数在线教程中的显示设置了我的服务,但是我的OnStart方法似乎根本没有被调用。该过程应该运行,然后无限循环,并不断检查服务器上要运行的命令。这是我的主菜单:
static void Main(string[] args)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new AgentService(args)
};
ServiceBase.Run(ServicesToRun);
}
这是我的服务构造函数和OnStart
的样子:
public AgentService(string[] args)
{
InitializeComponent();
this.Args = new ServiceArguments();
this.ValidArgs = this.Args.SetArgs(args);
this.AgentCycle = Int32.Parse(Args.Cycle);
}
protected override void OnStart(string[] args)
{
ServiceStatus serviceStatus = new ServiceStatus
{
dwCurrentState = ServiceState.SERVICE_START_PENDING,
dwWaitHint = 100
};
this.CimCommands = new Dictionary<string, CimCommand>();
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING;
SetServiceStatus(this.ServiceHandle, ref serviceStatus);
if (this.ValidArgs)
RunAgent();
}
我正在通过命令行传递args,但是如果没有给出,则我正在使用环境变量。所有这些都存在于我的机器上,所以我无法理解为什么我的服务没有以“及时的方式”启动。我只有2个额外的依赖项。一个是Newtonsoft.Json
,另一个是RestSharp
。
我也尝试过使用TopShelf将其编写为控制台应用程序,但这种方式也存在相同的错误。逻辑很合理,我已经测试了我的方法。有任何想法吗?
编辑:好的,这是解释该服务目标的最佳方法...该服务应该每5秒调用一次api /服务器,然后接收一个json告诉它什么命令在Windows计算机上运行。一旦完成所有这些命令,它将再次询问服务器是否有任何工作要完成,并且重新开始。自定义类型只是与Newtonsoft一起使用的json_objects,而Service Arguments只是一个具有5个字符串值和1个bool的对象。然后是用于从cmd行,环境变量或配置文件解析参数的函数。
答案 0 :(得分:0)
是的,从RunAgent调用的函数中肯定有无限循环。
虽然RunAgent()
没有返回,但是OnStart()
没有返回。当OnStart()
不返回时,服务管理器将终止该进程,因为“启动需要很长时间”。不要将无限循环放入OnStart函数!
有一次,该消息正是它所说的。它也确实可以解决问题(让您修复错误的代码)。为了进行轮询,您需要在“ onStart()”中启动的计时器之类的东西。也许是单独的后台任务或线程。不是自定义循环,您可以使用它来阻止OnStart()。