astel-labs.net

C#などのプログラミングTipsや雑記をつらつらと書くかもしれないブログです。

  • Home
RSS

WPF – タイマースレッドからWindow内のコントロールを操作

Posted on 2010年7月5日 by Nymphaea
No CommentsLeave a comment

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 を利用してメインスレッドを操作する必要があります

Categories: C#, WPF, プログラミング

 

Xmlファイルにリソースファイルを埋め込む
C#でZip圧縮形式ファイルの操作

コメントを残す

コメントを投稿するにはログインしてください。

  • 2010年7月
    日 月 火 水 木 金 土
     123
    45678910
    11121314151617
    18192021222324
    25262728293031
    « 6月   8月 »
  • 最近の投稿

    • raspberry pi に nginx をセットアップする
    • VSCode を日本語化する
    • raspberry pi に VSCode をインストールする
    • WindowsのプロダクトIDを取得する
    • SQL Server – money型とdecimal型を併用した金額計算
  • アーカイブ

    • 2020年3月
    • 2016年12月
    • 2014年6月
    • 2014年5月
    • 2013年7月
    • 2012年11月
    • 2012年7月
    • 2012年5月
    • 2012年4月
    • 2011年4月
    • 2011年1月
    • 2010年11月
    • 2010年10月
    • 2010年9月
    • 2010年8月
    • 2010年7月
    • 2010年6月
    • 2010年5月
    • 2010年4月
  • カテゴリー

    • C#
    • jQuery
    • OpenCV
    • raspberry pi
    • SharePoint
    • Silverlight
    • SQL Server
    • WCF
    • WPF
    • プログラミング
    • 未分類
    • 雑記
© astel-labs.net. Proudly Powered by WordPress | Nest Theme by YChong

このブログ内で公開されているソースコードおよびサンプルプログラムに関わるライセンスはすべて修正BSDライセンス(New BSD License)として公開しています。
但し、サンプルプログラムに含まれる外部アセンブリが同様のライセンスとは限りませんので、利用する前に必ずすべてのライセンスの確認を行ってください。