2

WPF アプリで奇妙なことが発生しています。私は DispatcherTimer と System.Timers.Timer クラスを試し、ストップウォッチで費やした時間を比較しました。DispatcherTimer を使用すると、アプリとストップウォッチ (30 分間テスト済み) で表示される間隔にほとんど違いはないようです。しかし、他のタイマーを使用すると、アプリケーションで大幅に時間が失われます。DispatcherTimer を使用することもできましたが、ここに問題があります。別の場所から UI を更新すると、ディスパッチャー タイマーがその特定の間隔でフリーズしているように見えるため、時間も失われます。なぜこれが起こっているのか、それを修正する方法は?

4

2 に答える 2

0

DispatcherTimer、レンダリングなどのすべての WPF GUI 処理を行う同じスレッドによって使用され、DispatcherTimer. これは、WPG GUI スレッドがディスプレイ内の何かを更新する必要がある場合、またはユーザーがマウスを新しいコントロールの上に移動した場合、またはその他の理由で、WPF GUI スレッドがより優先度の高い作業でビジー状態になる可能性があることを意味します。

の精度を向上させる方法は 2 つあります。DispatcherTimer

  1. DispatcherTimerより高い優先順位を与える
DispatcherTimer timer = new(DispatcherPriority.Input);

これは、デフォルトの DispatcherTimer の優先度よりも少し高速ですDispatcherPriority.Backgroundが、レンダリングの優先度は依然として高くなります。DispatcherTimer の優先度がレンダリングよりも高い場合DispatcherPriority.Send(最高の優先度など)、DispatcherTimer の処理に時間がかかると、GUI の表示が遅くなることがあります。

  1. DispatcherTimer.TickGUI スレッドが遅延を引き起こしたときに、次の呼び出しを早めます。

メソッドDispatcherTimer.Tickは、実行されるはずだった時間と実際に実行されていた時間を比較できます。x ミリ秒の遅延がある場合は、「DispatcherTimer.Interval」を x ミリ秒短縮します。

これについては、CodeProject で詳細な記事を書きました: Improving the WPF DispatcherTimer Precision

于 2022-02-28T10:40:43.870 に答える