0

それぞれの後にアクションを実行する Window-Service を作成しました。タイマーを次のように宣言しました。

using System.Timers;

....

Int32 myInterval = 60000 * (Convert.ToInt32(ConfigurationManager.AppSettings["lpInterval"].ToString()));
_myTimer = new Timer();
_myTimer.Interval = myInterval;
_myTimer.Elapsed += new ElapsedEventHandler(TimerElapsed);

    //Timer-Tick
private void TimerElapsed(object source, ElapsedEventArgs e)
{ PerformAction(); }

気付いたこと: (WCF サービスまたはサーバーの問題が原因で)PerformAction()私よりも時間がかかる場合は、新しいのが起動されて実行されます。したがって、は互いに2 回 (および ) 実行されます。interval'instance'PerformActionPerformActionparallel

これの原因は何ですか?なぜ前回PerformActionはキャンセルされないのですか?メソッドPerformActionは実行されていAsyncますか?

回避策を見つけましたが、動作がわかりません...

4

2 に答える 2

1

これは単にタイマーの設計上の決定です。イベントを並行して発生させることから、前のハンドラーが終了した直後までハンドラーをキューに入れることから、その特定のイベントを完全にスキップすることまで、さまざまな解決策があります。デザイナーはそのオプションを選択します。他の特定のタイマーの設計者が行ったように、彼らは簡単に別のタイマーを選択できたはずです。

キャンセルされない理由については、コードを非協調的にキャンセルすることは非常に危険であり、非常にエラーが発生しやすく、ティック ハンドラーの実装は通常、協調的なキャンセルを実装する必要性を感じません (本当に必要な場合は、既存の実装を使用して実装できます)。とにかく)したがって、これは実際には実用的なオプションではありません。

于 2014-07-01T14:03:05.873 に答える