1

私のアプリには、プロデューサー/コンシューマーのパイプラインが含まれています。

-> producer -> workers/producers -> worker -> (timer) ->
\<-----------------------------------------------------/

30秒ごとに再起動するには、作業全体が必要です。System.Timers.Timerパイプラインの下部にあるワーカーが作業を完了したときに開始されるタイマー () を使用しています。タイマーのデリゲートは、パイプラインの先頭にある待機中のプロデューサーに信号を送ります (Monitor待機/シグナルに使用しています)。

これは機能していますが、ユーザーはプロセス全体を停止して再起動することもできます。私の問題は、次の状況を処理する適切な方法が見つからないことです。

システムは、ユーザーが停止ボタンを押してすぐに再起動ボタンを押している間、タイマーで待機しています。システムを停止するには、最初にシステムを起動する必要があります (タイマーが X 秒後に実行するはずの作業を実行するため、待つ余裕はありません)。さまざまなスレッドが正常に終了しますが、タイマーはまだ生きています。再起動すると、スレッドが復活し、再び作業を開始します。タイマーが今デリゲートを実行することを決定した場合、それは問題です。

私はできることを知っていますtimer.Stop()が、MSDNには次のように書かれています:

イベント処理メソッドは、別のスレッドが Stop メソッドを呼び出したり、Enabled プロパティを false に設定したりすると同時に、あるスレッドで実行される場合があります。これにより、タイマーが停止した後に Elapsed イベントが発生する可能性があります。

また、問題を解決するための例を提供します: http://msdn.microsoft.com/en-us/library/system.timers.timer.stop.aspxしかし、私には少し低レベルで複雑に見えます。ある種のスリープ/再試行ループにより、間違った方法で目標を達成しようとしているようになります。

パイプラインを X 秒ごとに再起動できるようにし、ユーザーの停止/再起動コマンドの処理を不可能にしないように全体を設計するより良い方法はありますか? タイマーを使っていないのかもしれませんが、本当にわかりません...

4

0 に答える 0