0

System.Threading.Timer を使用する Windows サービスを開発しました。タイマーは x 分ごとに開始され、正常に動作します (タイマーはメソッドの最後で更新されます)。しかし、私がタイマーを更新し、いつ再開するかを彼に伝えているという事実にもかかわらず、ブロックサービスの試行にエラーが発生した場合、なぜそれが起こっているのですか? コードは次のとおりです。

 System.Threading.Timer serviceTimer;

 protected override void OnStart(string[] args)
 {
     TimeSpan diff;
     diff = nextRun - now;
     TimerCallback timerDelegate =
         new TimerCallback(MyTimerCallback);
     serviceTimer = new System.Threading.Timer(timerDelegate, null, 
         diff, new TimeSpan(-1));
 }

 public  void MyTimerCallback(object something)
 {   
    try
    {
        //possible error that happened
    }
    catch(Exception)
    {

    }
    finally
    {
        //diff is a new variable telling timer when to start again 
        serviceTimer.Change(diff, new TimeSpan(-1));
    }
 }

エラーが発生した場合にサービスが停止するのはなぜですか?

4

2 に答える 2

0

タイマーが変更できなかったのかもしれません。Timer.Changeブール値を返します:

タイマーが正常に更新された場合はtrue 。それ以外の場合はfalse

しかし、あなたはその結果をチェックしていません。おそらくタイマーをnew破棄し、毎回新しいタイマーを起動することをお勧めします。これは、タイマーが既に起動されており、「ワンショット」タイマーとして作成したためです。

finally
{
    serviceTimer.Dispose();
    serviceTimer = new System.Threading.Timer(timerDelegate, null, 
     diff, new TimeSpan(-1));
}
于 2012-09-12T13:48:03.420 に答える
0

誰かが同じ問題に対処する場合、私は次のように考えました:

何があってもサービスを存続させたいので、サービスが正常に開始されたことをサービスマネージャーに報告しています-

 base.OnStart(args);

構成では、legacyUnhandledExceptionPolicy を true (1) に設定できます。

于 2012-09-13T13:07:24.270 に答える