MetroStyleApp入門 vol20:タイマー処理

日曜日 , 27, 5月 2012 Leave a comment

 (当エントリーはVS11+Windows 8 Consumer Previewをもとに書かれています)

 

 Windows 8で一定期間で特定処理を行うタイマー処理の方法を紹介します。

 まずはタイマーをセット。

 

            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(1);
            timer.Tick += timer_Tick;
            timer.Start();

 

 上記コードは一秒舞にtimer_Tickというメソッドを呼び出すという指定をするコードです。

 

 タイマーで呼び出される処理timer_Tickのコードは以下、

 

        void timer_Tick(object sender, object e)
        {

            // ここにタイマー処理を書く
        }

 

 

 この辺はWindows Phoneと同じなので素直に移植できます。

 

コード補完の違い

 

 VisualStudio2010のWindows PhoneプロジェクトでDispatcherTimer.Tickイベントをコード補完する場合、

 [timer.Tick +=]まで打ち込んでTabキーを2回押すことで続きのイベントハンドラーまでを自動補完してくれます。

 

 Windows Phoneの場合

 

                    DispatcherTimer timer = new DispatcherTimer();
                    timer.Interval = TimeSpan.FromMilliseconds(10);
                    timer.Tick += new EventHandler(timer_Tick);
                    timer.Start();

 

 Windows 8の場合

 

            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(1);
            timer.Tick += timer_Tick;
            timer.Start();

 

 これまでは、自分でWindows 8風に書き換えるかデリゲートを利用していたので、この変更はちょっと嬉しい。

 

別の書き方

 

 新しく追加されたThreadPoolTimerクラスを利用しても同様の処理が実現できます。

 

var timer = ThreadPoolTimer.CreatePeriodicTimer(new TimerElapsedHandler(PeriodicTimerCallback), TimeSpan.FromMilliseconds(500));

 

 この場合、PeriodicTimerCallbackでUIスレッドにアクセスしようとすると例外が発生します。

 

    public sealed partial class BlankPage : Page
    {
        private CoreDispatcher dispatcher;

        public BlankPage()
        {
            this.InitializeComponent();

            var timer = ThreadPoolTimer.CreatePeriodicTimer(new TimerElapsedHandler(PeriodicTimerCallback), TimeSpan.FromMilliseconds(500));
            this.dispatcher = Window.Current.CoreWindow.Dispatcher;
        }

        private void PeriodicTimerCallback(ThreadPoolTimer timer)
        {
            dispatcher.InvokeAsync(CoreDispatcherPriority.Normal,
                                         (sender, args) =>
                                         {
                                             // UIスレッドにアクセスする処理
                                         }, timer, null);
            
        }

 

 Windows Phone(というかSilverlight)のDispatcher.BeginInvokeみたいですね。

 WinRTを使った新しい書き方も覚えておいて良いと思います。

 

 


Please give us your valuable comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です