たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

【C#】async / await をとりあえず使ってみて挙動を確認する方法(動かしながら学ぶ非同期処理)

今回はasync / await ついて書きます。そもそも最初は、”非同期ね。あー別スレッドで処理ね。”という感じで言葉で理解した気になっていて実際に勉強すると、全然処理の結果がイメージできなくて大変でした。今回はハマった思考法についてと、実際に挙動を確認しながら学ぶ方法について書いていきます。

同期処理とは

ある処理A・Bがあったとして、Aが実行されている時に、別の処理Bは実行できません。Aが終わることでBがスタートします。この様に、処理のタイミングをAとBで合わせることを同期処理といいます。例えば、会話も同じです。お互いタイミングを合わせますよね。

非同期処理とは

ある処理Aが実行されているタイミングで、処理Bも実行できることを非同期処理といいます。要は処理がタイミングを取り合っていません。メールやLINEの様に送ったあとは返事がくるまで待つようなイメージです。

使い所について

例としてよく挙がるのはGUIを使用したときの非ブロッキング処理です。いろんなサイトをみても、GUI処理に使用されると書かれているのですが、これは、”GUIで重い処理をした際に画面がフリーズしないようにするために非同期処理を使用する”。という意味合いで考えてOKだと思います。

GUIアプリの作り方

では、GUIアプリを作成して実際に挙動を確認してみましょう。作り方ですが、下記を参考にしてください。(丸投げ)
qiita.com

GUIアプリで作成してみた

上記記事を参考に作成しました。見た目はこんな感じ。ボタンを押したら”ButtonClick”が表示されます。
f:id:c_taquna:20190131012627g:plain

コードはこんな感じ

private void Button_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("ButtonClick_1");
}

GUIアプリで試すasync / await

同期処理

まずは同期処理を試します。

private void Button_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Start");
    System.Threading.Thread.Sleep(2000);
    MessageBox.Show("End");
}

一度押すと”Start”が表示され、それが閉じられると2秒間処理を受け付けず、”End”が出てきますね。処理のタイミングを合わせているので、同期処理です。この処理を受け付けない状況、つまりフリーズしている状況をなんとかできるのが非同期処理になります。
f:id:c_taquna:20190131090440g:plain

非同期

非同期処理になります。

       private async void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Start");
            await Task.Delay(2000);
            MessageBox.Show("End");
        }

今回は、まず1回目にボタンを押したら"Start"が表示されます。その後、もう一度ボタンを押します。同期処理だったら入力を受け付けられなかったのが、今回は入力が受け付けられ、"End"が2回表示されていることが分かります。これが非同期処理の効果です。
f:id:c_taquna:20190131091524g:plain

作ってみることで、イメージを強固なものにする

言葉だけ知っていてもよくわからないので、まずは動かしてみてどんな挙動になるか理解して上げると、処理の流れをイメージしやすくなるのかなと。詳細は別途書く予定ですがまずはこの記事でイメージを強くしてもらえればと思います。

次の記事

※執筆中