3

この小さなWindowsサービスをC#で作成しましたが、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ます。

OnStartWindowsでサービスを開始済みとして処理する場合は、完了する必要があります。

于 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 に答える