WindowsForms アプリケーションから WPF アプリケーションに移行する際、
タイマースレッドを使って処理を行い、その結果をメインスレッドのコントロールに結果を表示するなどをしていた場合に、Form から派生したメインウィンドウの BeginInvoke メソッドを使ってタイマースレッドからメインウィンドウのコントロールを操作していたと思います
しかし、WPF の Window クラスには BeginInvoke メソッドや Invoke メソッドは無いため、Window クラスの Dispatcher を利用してメインスレッドを操作する必要があります
ところが、MSDN をよく読んでみると WPF(.NET 3.0 以降)には DispatcherTimer クラスというものが追加されています
WPF でスレッドタイマーを扱う場合には、DispatcherTimer クラスを利用することで簡単にメインスレッドのコントロールを操作することができます
使い方も、WindowsForms の System.Threading.Time クラスとほぼ一緒です
(下記例は、xaml コード内に textBlock1 という名称の TextBlock が配置されているものとします)
using System; using System.Windows; using System.Windows.Threading; namespace Sample { /// <SUMMARY> /// MainWindow.xaml の相互作用ロジック /// </SUMMARY> public partial class MainWindow : Window { private DispatcherTimer m_Timer = null; public MainWindow() { InitializeComponent(); // Loadedイベントの登録 this.Loaded += new RoutedEventHandler( MainWindow_Loaded ); } private void MainWindow_Loaded( object sender, RoutedEventArgs e ) { // タイマーを作成する m_Timer = new DispatcherTimer( DispatcherPriority.Normal, this.Dispatcher ); m_Timer.Interval = TimeSpan.FromSeconds( 1 ); m_Timer.Tick += new EventHandler( DispatcherTimer_Tick ); // タイマーの実行開始 m_Timer.Start(); } private void DispatcherTimer_Tick( object sender, EventArgs e ) { // 現在時刻の更新(処理はメインスレッドで実行される) this.textBlock1.Text = DateTime.Now.ToString(); } } }
DispatcherTimer クラスを利用する際に注意しなければならないのは、タイムアウトで呼び出される Tick イベントが処理されるスレッドは「メインスレッド」であるということです
上記例の DispatcherTimer_Tick メソッド内で時間のかかる処理を行うと、ウィンドウが操作を受け付けなくなる可能性がありますので注意してください
タイマーを使って重い処理を行う場合は、従来通り System.Threading.Time クラスとWindow クラスの Dispatcher を利用してメインスレッドを操作する必要があります
コメントを残す
コメントを投稿するにはログインしてください。