かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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秒間待つような処理を作れます。あまり実践では役に立たないでしょうが一応メモということで。

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