かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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

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