3

我在 c# 中创建了这个小型 Windows 服务,我相信我的 ThreadPool 代码可能做错了什么,导致我的 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);

}
4

2 回答 2

3

您正在阻止OnStart来电WaitHandle.WaitAll(doneEvents);。Windows 尝试启动该服务,但由于WaitAll.

OnStart如果您希望 Windows 将服务视为已启动,则需要完成。

于 2011-06-08T00:19:31.327 回答
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();
}
于 2011-06-08T01:26:57.287 回答