web-dev-qa-db-ja.com

タイマーとDispatcherTimerの比較

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

95
paradisonoir

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

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

一般的に、WPF == DispatcherTimerおよびWindows Forms == Forms.Timer

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

109
Reed Copsey

私はここで小さな例でタイマーに関する良い記事を見つけました: http://www.progware.org/Blog/post/Timers-in-WPF.aspx

結論として:

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

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

4
Seekeer