この章のテーマ §
asyncキーワード/await演算子の使い方を学びます。これらは非同期メソッドを実現するために存在します。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, int型, メソッドの基礎., ジェネリックの基礎
解説 §
世の中には、非同期メソッドというものがあります。これは、「処理が終了する前に戻ってくる。結果を受け取るには追加のアクションが必要」というものです。はっきり言って面倒くさいのですが、バッテリ節約、リソース節約の効能があるので、利用を求められるケースがあります。
そこで、簡単に非同期メソッドを利用するために、C#にはasyncキーワード/await演算子が用意されています。
Task型あるいはTask<T>型を返す非同期メソッドを呼び出すときは、先頭にawait演算子を付けると処理が終了するまで実行を待っていてくれます。そのため、普通のメソッド呼び出しのように使えます。
await演算子が含まれるメソッドも非同期メソッドにしなければなりません。そのためには、メソッドの宣言にasyncキーワードを付け、戻り値の型をTaskまたはTask<T>に変更します。Tは返したい値の型です。voidの場合はTaskになります。
罠の数々 §
- awaitで待っている間に他のコードが動作することがある。そのことで混乱が起きないように配慮してコードを書こう
- 非同期メソッドの戻り値の型はvoidにすることもできる。この場合は、【終了を待つ必要がないメソッド】となり、呼び出しにawait演算子は必要ないが、実行の終了タイミングを知る方法はない
- TaskはSystem.Threading名前空間にあるクラスである。主に並列処理を行うために使用されるクラスである
- 非同期メソッドとマルチスレッドなどの並列処理は違うものである。非同期メソッドを呼び出すと即座に何か別の処理が並列で実行されるわけではない。待ち時間が発生したときに、他のタスクが動作するかもしれないだけである
参考リンク §
async (C# リファレンス)
await 演算子 (C# リファレンス)
サンプルソース: kw_async §
var r = await sub(123,456);
Console.WriteLine($"計算結果: {r}");
async Task<int> sub(int x,int y)
{
await Console.Out.WriteLineAsync("計算中...");
return (x + y) / 2;
}
実行結果 §
計算中...
計算結果: 289
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。なお、 await Task.Delay(1000);は1秒待機するコードである。
SubAsync();
async void SubAsync()
{
// 1秒待つ
await Task.Delay(1000);
Console.WriteLine("Hello!");
}
- 何も出力しない
- H
- Hello!
- コンパイルエラー
- 実行時例外
[[解答]]