(当エントリーは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