2011-06-08 111 views
3

我做在C#中这个小窗口服务,我相信我可能做错了我的线程池代码,阻止我的Windows服务从完全开始。如果您必须知道,Windows服务似乎只能在服务控制台上运行时才能完美运行,但它仍表示它正在“启动”。当我重新启动我的服务器时,即使我已将其设置为自动启动,该服务似乎仍然停止。Windows服务没有完全启动

请参阅下面我的代码:

protected override void OnStart(string[] args) 
{ 
    int itemCount = itemList.Count; 

    this.doneEvents = new ManualResetEvent[itemCount]; 
    for (int i = 0; i < itemCount; i++) 
    { 
     int oId = this.itemList[i]; 
     this.doneEvents[i] = new ManualResetEvent(false); 

     ThreadPool.QueueUserWorkItem(data => 
     { 
      while (this.activated) 
      { 
       DateTime start = DateTime.Now; 

       // my code here 

       // choke point 
       TimeSpan duration = (DateTime.Now - start); 
       if (duration.Milliseconds < CONST_WAITMILLISECONDS) 
        Thread.Sleep((CONST_WAITMILLISECONDS - duration.Milliseconds)); 
       } 

       this.doneEvents[i].Set(); // thread done 

      }, oId); 
     } 

     WaitHandle.WaitAll(doneEvents); 

} 
+1

你有代码,以一个间接层。对OnStart()**的调用必须及时返回(例如,在30秒内)。否则,操作系统将终止该服务。因此,你需要把当前的逻辑在'的OnStart()'方法()''被催生的OnStart线程,即一个间接层。 – 2011-06-08 03:09:21

回答

2

我想你可以在一个线程里面包裹的OnStart逻辑。当您收到OnStop事件时,此线程将被关闭。

事情是这样的:

Thread _ServiceThread; 
protected override void OnStart(string[] args) { 
    _ServiceThread = new Thread(() => { /* your current OnStart logic here...*/ }); 
    _ServiceThread.Start(); 
} 
protected override void OnStop() { 
    _ServiceThread.Stop(); 
} 
+0

谢谢,但我会认为这是一个在此期间的创可贴解决方案。我真的需要现在发布这个项目。 – 2011-06-08 02:28:38

+2

+1这不是一个创可贴。它代表了启动Windows服务的规范形式。 – 2011-06-08 22:49:20

+0

感谢马特澄清。 – 2011-06-09 15:45:06

3

你被WaitHandle.WaitAll(doneEvents);阻断OnStart电话。 Windows试图启动该服务,但由于WaitAll超时。

你需要让OnStart完整的,如果你想让Windows治疗服务为启动。

+0

嗨,感谢您的快速响应。什么是更好的解决方案? – 2011-06-08 00:22:50

+0

删除'WaitHandle.WaitAll的(doneEvents);' – 2011-06-08 00:28:28

+0

但我需要这种逻辑在其整个生命不断运行循环。我做错了吗? – 2011-06-08 00:32:27