2

Windowsサービスでタスクがあります。対象のコードは次のとおりです。

private Task Schedule(Action action, int interval, EventDefinition restoreEvent = null) {
    return new Task(() => {
        bool error = false;
        while (IsEnabled && !CTS.Token.IsCancellationRequested) {
            if (!IsPaused) {
                try { // we don't want our service to crash if anything goes wrong on production
                    action();
                    if (error && restoreEvent != null) SysEvent(restoreEvent);
                    error = false;
                }
                catch (Exception x) {
                    error = true;
                    SysEvent(new EventDefinition { Id = x.HResult, Message = x.Message, Type = EventLogEntryType.Error });
                }
            }
            CTS.Token.WaitHandle.WaitOne(interval);
        }
    }, CTS.Token, TaskCreationOptions.LongRunning);
}

ご覧のとおり、私のサービス タスクはループ、エンドレス ループで実行されます。ループは、IsEnabled が false に設定されている場合にのみ終了できます。これは、サービス開始コードとサービス停止コードの 2 つのポイントでのみ設定されます。タスクのキャンセルが要求されたときに終了することもできますが、これによりサービスが停止します。

しかし、私のサービスは実行中です!停止またはキャンセルのリクエストを受け取っていません。while ループでタスクを中断できる例外はありませんでした。しかし、約 30 時間後、サービスは理由もなく停止しました。その状態はまだ実行中です。どのシステム ログにも、エラーや警告は 1 つもありません。それはただ静かに死んだ。

何が起きたの?手がかりはありますか?.NET タスクがこのように停止することはありますか?

4

0 に答える 0