1

何らかの奇妙な理由で、Elapsed イベントが 2 回発生しています。その直後、タイマーが機能しなくなります... コード構造は次のようなものです: 特定のオブジェクトは、500 ~ 1500 ミリ秒間隔で常に更新される値が X を超えて増加したときに、特定のイベントを発生させるように定義されています。前の値と比較した合計。

たとえば、X を 2 と定義し、受け取る値が 1,2,1,2,3,4,8 の場合、8 が入力されるとイベントが発生します。そのイベントのイベント ハンドラーは前述のタイマーを開始します。このタイマーは Y 時間実行されてから、問題のあるイベントを発生させます。タイマーが経過する前に値が正常に戻った場合、タイマーはリセットされます。

したがって、全体的な結果は、特定の動的な値を測定し、Y 秒以上発生する大きな X サイズの例外を監視するアプリケーションになるはずです。

コードの全体的な結果は次のようになります

vMonitor.Range=X;
vMonitor.Over+= new EventHandler(StartTimer);
vMonitor.Normal+= new EventHandler(StopTimer);
vTimer.Elapsed+= new EventHandler(RaiseAlert);
source.BeginUpdate(vMonitor.Value);

実際の問題は、タイマーが経過すると RaiseAlert が 2 回発生し、タイマーが完全に機能しなくなったかのように発生し、まったく起動しないことです。完全なアプリケーションには多くのスレッド アクティビティが含まれており、一度に少なくとも 2 つのスレッドが実行され、vMonitor の値が更新されていることに言及する価値があると思います。

何かご意見は?

アップデート:

スレッドの問題については、正確な構造を説明するのはかなり複雑ですが、vMonitor オブジェクトは、監視された方法で、さまざまなスレッドによって絶えず変更される更新値を含む別のオブジェクトに含まれていると言えます。 . 親オブジェクトの値が更新されるたびに、vMonitor と比較され、適切なイベントが発生します。その後、vMonitor の値は親オブジェクトの値に置き換えられます。

編集: もう一度確認しました。vTi​​mer.Elapsed デリゲートは、正しいイベント ハンドラーを 1 つだけ保持します。

4

3 に答える 3

3

MSDNから:

Elapsed イベントは、ThreadPool スレッドで発生します。Elapsed イベントの処理が Interval より長く続く場合、イベントは別の ThreadPool スレッドで再び発生する可能性があります。したがって、イベント ハンドラーは再入可能である必要があります。

于 2008-10-28T01:50:39.883 に答える
0

それが最も簡単な答えであることを完全に忘れていたので、ミッチが言ったことを考慮して編集してください。Elapsed イベントを処理するメソッドでは、最初にタイマーを停止していることを確認して、処理中にイベントが再び発生しないようにします。

于 2008-10-28T01:39:08.050 に答える
0

私の最も基本的な本能は、どういうわけか実際には Elapsed イベントに 2 つのイベント ワイヤアップがあり、その結果 2 つのイベントが発生するということです。これは、イベント ワイヤアップがデザイナーに既に追加されているときに手動で追加したか、またはワイヤアップが既に基本クラスにあり、それを繰り返している継承の側面があるためです。派生クラスで。

もちろん、複数のスレッドがある場合、それはまったく別の球技です!

于 2008-10-27T08:50:47.117 に答える