かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

WinRTアプリケーションでSleepしたい

基本的に、Sleepなんてすることはあまりないと思うのですが、ちょっとしたサンプルで重たい処理をエミュレートしようと思ってThread.Sleepを呼ぼうと思ったらThreadクラスがない!?古き良き?Threadクラスを使った並列処理なんてクレイジーどころか存在しないものになってしまったのですね。
ということで代替の方法です。同じことに困ってる先人はいるもので、下記のMSDNのフォーラムでそのまま質問があがってました。質問のほうでは、Timerも無いよ!?ということも聞いてるので見てみるといいかもしれません。

Sleepしよう

ということで数秒まって処理をするということをやってみたいと思います。使うメソッドはTaskクラスDelayメソッドです。
画面にボタンを1つおいてボタンのクリックイベントハンドラと、重たい処理をエミュレートするメソッドを書きます。

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    // HeavyProcessメソッドの呼び出し自体は一瞬でButton_Click_1メソッドは
    // すぐ終わることに注意してね。
    HeavyProcess();
}

private async void HeavyProcess()
{
    var stopwatch = Stopwatch.StartNew();
    // 5秒くらいの重い処理
    await Task.Delay(TimeSpan.FromSeconds(5));
    stopwatch.Stop();

    new MessageDialog(stopwatch.ElapsedMilliseconds + "ms!!").ShowAsync();
}

これで、プログラムを実行してボタンを押すと、5秒間待つような処理を作れます。あまり実践では役に立たないでしょうが一応メモということで。

ちなみに実行してボタンを押すとこんな結果になります。