3

私の WPF アプリケーションでは、3 つの異なる DispatcherTimer を使用しています。

  • 1つは現在の時刻を表示するためのものです
  • 1 つは、5 秒ごとに DB クエリを実行するためのものです。
  • 3 つ目は、カスタム ボタンの値を 1 秒ごとに更新します。

プログラムの実行中に、多くの遅延やフリーズが発生します。たとえば、時間は正しく刻み始めますが、突然値がフリーズし、フリーズした後、たとえば時間が +3 秒増加します。

アプリケーション全体でこの動作が発生しています。複数のタイマーでこの問題を解決する適切な方法は何ですか?

編集:

DispatcherTimer を System.Timers 名前空間のタイマーに置き換えるのに問題があります。

//new code with timer
timerW = new Timer();
        timerW.Elapsed += new ElapsedEventHandler(timerWegingen_Tick);
        timerW.Interval = 5000; 
        timerW.Start();

        //OLD Working Code
        timerW = new DispatcherTimer();
        timerW.Tick += new EventHandler(timerWegingen_Tick);
        timerW.Interval = new TimeSpan(0, 0,5);
        timerW.Start();

エラー : 「多くの UI コンポーネントがこれを必要とするため、呼び出しスレッドは STA でなければなりません。」

よろしくお願いします。

4

3 に答える 3

3

DispatcherTimer は UI スレッドで実行されます。そのため、UI スレッドが間隔を超えてビジーである場合、UI スレッドが自由に実行できるようになったときに実行されます。より正確なスケジューリングが必要な場合は、バックグラウンドで実行するよりも時間をかけて実行する必要があります (System.Threading.Timer、System.Timers.Timer)。ただし、マーシャリングを忘れないでください。

hth、マーティン

于 2012-04-16T11:36:52.663 に答える
0

これは、それらがすべて同じスレッドで実行されているためだと思います。

于 2012-04-16T11:35:36.393 に答える
0

System.Threading.Timer を使用し、UI を更新するときに SyncronizationContext.Syncronize を使用して更新コードを実行します。

UI スレッドで SyncronizationContext.Current からコンテキストを取得することを忘れないでください。

于 2012-04-16T12:26:03.883 に答える