2

.NET Windows サービスを作成し、bin/debug フォルダーからデバッグ リリースをインストールしました (はい、これが適切な方法ではないことはわかっていますが、テストしてデバッガーをアタッチできるようにしたいだけです)。

このサービスは基本的に、FTP ディレクトリでファイルをチェックし、それらを処理し、1 分間スリープしてからループする無限ループで実行されます。

サービスを開始しようとすると、次のエラーが表示されます

Error 1053: The service did not respond to the start or control request in a timely fashion

さらに調査すると、サービスは最初のループを完了し、最初のスレッドのスリープ中にタイムアウトします。そのため、どのようにサービスを開始すればよいかについて、やや混乱しています。これを引き起こしているのは、スレッド化に対する私の (欠如した) 理解ですか?

私のスタートコードは

protected override void OnStart(string[] args)
    {
        eventLog.WriteEntry("Service started");
        ThreadStart ts = new ThreadStart(ProcessFiles);
        workerThread = new Thread(ts);
        workerThread.Start();
    }

ProcessFiles 関数では、ループが完了したら、単純に

eventLog.WriteEntry("ProcessFiles Loop complete");
Thread.Sleep(new TimeSpan(0,1,0));

イベント ログを確認すると、'ProcessFiles Loop complete' ログがありますが、これはサービスがタイムアウトする前の最後のイベントであり、開始に失敗します。

誰かが私が間違っていることを説明できますか?

編集

ProcessFiles 関数でループを処理する方法は次のとおりです。

while (!this.serviceStopped)
{
    // Do Stuff
    eventLog.WriteEntry("ProcessFiles Loop complete");
    Thread.Sleep(new TimeSpan(0,1,0));
}

乾杯

スチュワート

4

2 に答える 2

2

イベント ログを確認すると、「ProcessFiles Loop complete」ログが存在します...

サービスがタイムアウトになるまで戻らないファイル処理のコードがある可能性があります。間隔を置いていくつかのタスクを実行しようとしています。ループの代わりにSystem.Timers.TimerまたはSystem.Windows.Forms.Timerを使用して、いくつかのタスクを繰り返し実行することをお勧めします。

ループの問題であるかどうかをテストするには、ループを sleep ステートメントで単一の反復に制限し、サービスが開始されるかどうかを確認します。

protected override void OnStart(string[] args)
{
    aTimer = new System.Timers.Timer(10000);
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    aTimer.Interval = 60000;
    aTimer.Enabled = true;
}

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    aTimer.Enabled = false;
    // Put file processing code here.
    aTimer.Enabled = true;
}
于 2013-05-27T11:25:12.340 に答える