C# 入門

ホーム > 非同期プログラミング > タスクベース・非同期パターン: async と await による非同期プログラミングとは

タスクベース・非同期パターン: async と await による非同期プログラミングとは

スポンサーリンク

C# 5.0 で導入された非同期プログラミング (asynchronous programming) のパターンは、 タスクベース・非同期パターン (Task-based Asynchronous Pattern) を実装するものです。

タスク (Task)・非同期 (Asynchronous)・パターン (Pattern) ということで、省略するときは TAP などと省略します。

対比されるデザインパターンとしては、APM とか EAP などがあります。

まずは、従来型である APM と EAP をおさらいして、それから新しく導入された TAP へと進みましょう。

従来の非同期プログラミング APM、EAP とは?

APM (非同期プログラミングモデル) とは

まず、APM ですが、これはそのまま非同期プログラミングモデル (Asynchronous Programming Model) の略です。

どういうものかというと、IAsyncResult デザインパターンを利用するものです。

具体的には BeginMethodName で処理を開始して、 EndMethodName という二つのメソッドを実装するタイプです。

Begin... で処理を開始します。開始した処理が時間のかかる処理であっても、それは裏側で処理が実行されるので、 Begin... メソッド自体は返ってきます。

後で処理結果を得るために End... メソッドを呼び出します。まだ処理が終わっていない場合はここで処理がブロックされます。

EAP (イベントベースの非同期プログラミング) とは

一方、EAP は Event-based Asynchronous Programming の略です。

EAP は非同期処理の終了確認に、イベントハンドラのコールバックを利用するタイプです。

XXXCompletedEventHandler というようなイベントハンドラをセットしてから、ProcessAsync というメソッドを呼び処理を開始するタイプです。

タスクベース非同期パターン (TAP) とは?

C# 5.0 で新しく導入されたタスクベース・非同期パターン (TAP) では、処理の開始は MethodNameAsync という形式をとります。

そしてその戻り値を、Task または Task<T> または void とします。Task の場合はその結果は void 型、Task<T> では結果が T 型です。

C# 5.0 では TAP の一連の非同期プログラミングの実装が容易になるように、コンパイラレベルでサポートしています。

C# 5.0 では非同期プログラミングが書きやすくなった。そして Task を活用する。 Task を待つには await。await を利用するメソッドには async を付けるというところがポイントになります。

これらの詳細は他の記事をみてください。

蛇足かもしれませんがコンパイラレベルでサポート、ということは C# のコードから、さらに IL へ落とし込むときに、 C# のコンパイラが便利なコードを差し込んでくれて .NET Framework に適合するようにしてくれる、ということです。また、 例えば await があるのに async を付けていない時はコンパイラが教えてくれるということでもあります。

async を付けるとコンパイラが IAsyncStateMachine を実装した struct 型を生成し、 メソッドにその型を引き渡して AsyncStateMachine 属性を付けるというようなことをするようです。

スポンサーリンク
ホーム > 非同期プログラミング > タスクベース・非同期パターン: async と await による非同期プログラミングとは