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