【C#】async / await をとりあえず使ってみて挙動を確認する方法(動かしながら学ぶ非同期処理)
今回はasync / await ついて書きます。そもそも最初は、”非同期ね。あー別スレッドで処理ね。”という感じで言葉で理解した気になっていて実際に勉強すると、全然処理の結果がイメージできなくて大変でした。今回はハマった思考法についてと、実際に挙動を確認しながら学ぶ方法について書いていきます。
同期処理とは
ある処理A・Bがあったとして、Aが実行されている時に、別の処理Bは実行できません。Aが終わることでBがスタートします。この様に、処理のタイミングをAとBで合わせることを同期処理といいます。例えば、会話も同じです。お互いタイミングを合わせますよね。
非同期処理とは
ある処理Aが実行されているタイミングで、処理Bも実行できることを非同期処理といいます。要は処理がタイミングを取り合っていません。メールやLINEの様に送ったあとは返事がくるまで待つようなイメージです。
使い所について
例としてよく挙がるのはGUIを使用したときの非ブロッキング処理です。いろんなサイトをみても、GUI処理に使用されると書かれているのですが、これは、”GUIで重い処理をした際に画面がフリーズしないようにするために非同期処理を使用する”。という意味合いで考えてOKだと思います。
GUIアプリで作成してみた
上記記事を参考に作成しました。見た目はこんな感じ。ボタンを押したら”ButtonClick”が表示されます。
コードはこんな感じ
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”が出てきますね。処理のタイミングを合わせているので、同期処理です。この処理を受け付けない状況、つまりフリーズしている状況をなんとかできるのが非同期処理になります。
非同期
非同期処理になります。
private async void Button_Click(object sender, RoutedEventArgs e) { MessageBox.Show("Start"); await Task.Delay(2000); MessageBox.Show("End"); }
今回は、まず1回目にボタンを押したら"Start"が表示されます。その後、もう一度ボタンを押します。同期処理だったら入力を受け付けられなかったのが、今回は入力が受け付けられ、"End"が2回表示されていることが分かります。これが非同期処理の効果です。
作ってみることで、イメージを強固なものにする
言葉だけ知っていてもよくわからないので、まずは動かしてみてどんな挙動になるか理解して上げると、処理の流れをイメージしやすくなるのかなと。詳細は別途書く予定ですがまずはこの記事でイメージを強くしてもらえればと思います。
次の記事
※執筆中