0

dobleclick にインストールされる Windows Server を作成しています。しかし、私はコアコードを書いています。私が直面している問題は

Windows Server はデータベースから 10 レコードを取得し、WCF サービスを使用してアップロードします。これらの 10 個のレコードが完了すると、サービスは再びデータベースを調べて、再び 10 個のレコードを取得します。

しかし、このプロセスが5分ごとに続行されるように、タイマーも使用しています。ある時点で、WCF を使用したこのアップロードに 5 分以上かかった場合は、新しい実行を停止して、完了するまで待つ必要があります。

どうすれば実行できますか。

4

4 に答える 4

3

タイマーが作動するたびに、タイマーを無効にし、実行の最後に再度有効にして、最後の実行の終了から5分後に再び作動するようにします。

于 2012-07-19T11:33:29.470 に答える
1

これは、ロックの理想的なシナリオです。以下の例では、コールバックは 5 分ごとにトリガーされます。次のコールバックがトリガーされたときにサービスがまだ前のバッチを処理している場合、それは単純に破棄され、5 分後に再試行されます。必要に応じて、これを変更してコールバックをキューに入れることができますが、キューに入れすぎるとスレッド プールの枯渇に注意する必要があります。

バッチがオーバーランするシナリオでの長い遅延を避けるために、間隔を 1 分に短縮することもできます。

static Timer timer; 
static object locker = new object(); 

public void Start() 
{ 
    var callback = new TimerCallback(DoSomething); 
    timer = new Timer(callback, null, 0, 300000); 
} 

public void DoSomething() 
{ 
    if (Monitor.TryEnter(locker)) 
    { 
       try 
       { 
           // my processing code 
       } 
       finally 
       { 
           Monitor.Exit(locker); 
       } 
    } 
} 
于 2012-07-19T11:48:53.403 に答える
0

作業を開始するときに、ブール値を設定する(またはさらに適切にロックする)のはなぜですか。

ループで、ブール(またはロック)がアクティブであるかどうかを確認してからスキップします。これにより、次のバッチがさらに5分で実行されます。

于 2012-07-19T11:34:05.897 に答える
0

a を使用しTimerて 5 分間の時間を計測しますが、繰り返さないように伝えます。

timer = new Timer(state => FetchRecords(), null, 
                    new TimeSpan(0, 5, 0), Timeout.Infinite);

FetchRecordsこれにより、5 分経過後にメソッドが呼び出されますが、繰り返しはありません ( Timeout.Infinite)。

メソッドの最後でFetchRecords、タイマーを再起動します。

timer.Change(new TimeSpan(0, 5, 0), Timeout.Infinite);

これにより、タイマーが再び開始されます。

このパターンでは、メソッド呼び出しがこの時間内に完了する限り、5 分ごとにハートビートを刻むことができますが、メソッド呼び出しがまだ進行中の場合は刻みません。

于 2012-07-19T11:44:05.667 に答える