タイマーとDispatcherTimerの比較


98

違いは何ですbetween System.Windows.Forms.Timer()System.Windows.Threading.DispatcherTimer()?どの場合に、それらを使用する必要がありますか?ベストプラクティスはありますか?

回答:


111

Windows.Forms.TimerWindowsフォームメッセージループを使用して、タイマーイベントを処理します。これは、Windowsフォームアプリケーションで使用されているタイミングイベントを書き込むときに使用し、メインUIスレッドでタイマーを起動する必要があります。

DispatcherTimerWPFタイミングメカニズムです。同様の方法でタイミングを処理する必要があり(これは単一のスレッドに限定されない-各スレッドには独自のディスパッチャーがある)、WPFを使用している場合に使用する必要があります。Dispatcherと同じスレッドでイベントを発生させます。

一般的に、WPF == DispatcherTimerそしてWindows Forms == Forms.Timer

そうは言ってもSystem.Threading.Timerclass別のスレッドで起動するタイマーもあります。これは、UIなどを更新しようとしない純粋な数値タイミングに適しています。


1
あなたの迅速な対応に感謝。つまり、UIに関連するタイマーが必要なときはいつでも、DispatcherTimerを使用する必要があります。また、ULをフリーズしたくないタイマーを起動したいときは、System.Threading.Timerを個別に使用する必要があります。糸。2番目の質問は、DispatcherTimerを使用したい場合、UIにバインドされていないタイマーを使用したい場合、System.Threading.TimerまたはそれでもDisptacherTimerを使用して別のスレッドで呼び出す必要がありますか?
paradisonoir

3
それはあなたが何をしようとしているのかに依存します。私はめったにSystem.Threading.Timerを使用しません-通常はDispatcher Timerに固執し、BackgroundWorkerのようなものを使用して、別のスレッドでWORK(UIをブロックする可能性があるもの)を実行します。イベントハンドラーで "多すぎる"作業を行わない限り、タイマーがUIをブロックすることはありません。
リードコプシー、

DispatcherTimerが時間とともにプロセッサを使い果たしてしまう問題が発生しています。それを処理する良い方法はありますか?
discorax

具体的に何がCPUを消費しているかを確認してください。停止されていないタイマーをたくさん作成していますか?
リードコプシー

3
間隔プロパティを正しく設定していることを確認してください。これを行わないでください:timer1.Interval = new TimeSpan(1000); //「1000」はミリ秒ではなくティックを表します!これで修正するまで、CPUは非常に高かった:timer1.Interval = System.TimeSpan.FromSeconds(1);
ロニーベスト

4

タイマーに関する良い記事がここにあります:http : //www.progware.org/Blog/post/Timers-in-WPF.aspx

結論として:

DoSomething()がGUIコンポーネントを操作する場合は、タイマーを使用する必要があります:this.Dispatcher.Invoke((Action)delegate {// GUI RELATED CODE HERE}別のスレッドから直接GUIコントロールにアクセスできないため。DispatcherTimerを使用すると、それをする必要はありません。

DoSomething()が時間のかかるタスクとして実行される場合、DispatcherTimerの場合はGUIがフリーズします。タイマーの場合、長いメソッドが別のスレッドで実行されるため、そうなりません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.