3

私は正常に実行および起動するWindowsサービスを持っていますが、いくつかの深刻な計算を行うバックグラウンドスレッド(複数)を実行しています。

少し掘り下げた後、すべてのWindowsサービスのタイムアウトが原因であることがわかりました。現在、データベース内のテーブルから読み取り、それをオブジェクトにロードしてから、そのオブジェクトに対して何らかの分析を行います。これはすべて、他のメソッドを呼び出す OnStart メソッドで行われます。サービスを実行し続けるためのトリックや、レジストリにアクセスせずにタイムアウトを停止する方法はありますか? ありがとう

4

2 に答える 2

5

OnStart 関数は、実行に時間がかかるロジックの場所ではありません。基本的に、OnStart 関数の外側にロジック用のクラスを作成する必要があります。エントリ関数、つまりデータを取得して処理を開始する関数を公に宣言する必要があります。

例えば

class ProcessingClass()
{
    public void ThreadStartProc()
    {
         GetData();
         StartProcessing();
    }
 }

onStart メソッドで、新しい Thread を作成し、ThreadStart を ThreadStartProc 関数に設定します。例えば

Thread ProcessingThread;
ProcessingClass procClass = new ProcessingClass();

protected override void OnStart(string[] args)
{
    ProcessingThread = new Thread(new ThreadStart(procClass.ThreadStartProc));
    ProcessingThread.Start();
}

protected override void OnStop()
{
     if (ProcessingThread != null)
     {
          ProcessingThread.Abort();
          ProcessingThread.Join();
          ProcessingThread = null;
     }
}

処理クラスでは、サービスが停止したときにスローされる ThreadAbortException を処理する必要があります。

于 2012-10-15T16:10:58.403 に答える
4
  1. OnStart メソッドからロジックを移動します。
  2. Service.RequestAdditionalTime() メソッドを使用します。

このSOの回答を参照してください: Windowsサービスの起動タイムアウト

于 2012-10-15T15:45:35.347 に答える