トルネード

毛利のメモ書き

UWP 入門 - async/await シンプルな例

mojeld.amebaownd.com

async/awaitについて、上記URLにもすごくシンプルな例を書いています。 ここでは、Task.Run()中にXAMLのオブジェクトを変更する例です。

まず、「ProgressBar」「Button」「TextBox」を適当に配置します。 f:id:mojeld:20180723114522p:plain

「ProgressBar」「TextBox」に名前をつけます。

Name
ProgressBar p1
TextBox t1
<ProgressBar HorizontalAlignment="Stretch" Height="2" VerticalAlignment="Top" Margin="0,15,0,0" IsEnabled="False" IsIndeterminate="False" Name="p1"/>
<Button Content="ボタン" HorizontalAlignment="Left" Margin="66,56,0,0" VerticalAlignment="Top" Height="62" Width="130" Click="Button_ClickAsync"/>
<TextBox HorizontalAlignment="Left" Margin="66,144,0,0" Text="TextBox" VerticalAlignment="Top" Width="130" Height="74" Name="t1"/>

ボタンイベントのコード

ボタンが押されたときに、Task.Run()を実行するコードを書きます。

private async void Button_ClickAsync(object sender, RoutedEventArgs e)
{
    p1.IsEnabled = true;
    p1.IsIndeterminate = true;
    t1.Text = "5000数えた後時間表示";
    await Task.Run(async () =>
    {
        //何か重たい処理
        for (int i = 0; i < 5000; ++i)
        {
            Debug.WriteLine("{0}", DateTime.Now);
        }
        // for のそこそこの処理が終わった後
        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low, () => {
            t1.Text = string.Format("{0}", DateTime.Now); //テキストボックスに書く
            p1.IsIndeterminate = false; //プログレスバーのアニメを止める
            p1.IsEnabled = false;       
        });
    });
}

Task.Run()中に、await Dispatcher.RunAsync()実行すると、XAML側を更新することができます。
f:id:mojeld:20180723115501g:plain