between System.Windows.Forms.Timer()
とSystem.Windows.Threading.DispatcherTimer()
の違いは何ですか?どの場合に使用する必要がありますか?ベストプラクティスはありますか?
Windows.Forms.Timer
は、Windowsフォームメッセージループを使用してタイマーイベントを処理します。 Windows Formsアプリケーションで使用されているタイミングイベントを記述するときに使用する必要があり、メインUIスレッドでタイマーを起動する必要があります。
DispatcherTimer
はWPFタイミングメカニズムです。同様の方法でタイミングを処理する場合に使用する必要があります(これは単一のスレッドに限定されませんが、各スレッドには独自のディスパッチャがあります)。WPFを使用しています。 Dispatcherと同じスレッドでイベントを発生させます。
一般的に、WPF == DispatcherTimer
およびWindows Forms == Forms.Timer
。
そうは言っても、 System.Threading.Timer
、別のスレッドで起動するタイマーclass
です。これは、UIを更新しようとしていない、純粋に数値的なタイミングに適しています。
私はここで小さな例でタイマーに関する良い記事を見つけました: 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はフリーズします。タイマーの場合、長いメソが別のスレッドで実行されるため、タイマーは実行されません。