「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次  †
概要  †
非同期処理の実装方式について。
詳細  †
非同期処理の定義  †
- 一般的に、非同期処理と言うと、
同期処理(オンライン)との対比になり、
同期処理(オンライン)オンラインとの待ち合わせをする。 
- 同期処理(オンライン)と待ち合わせをしない場合は、
同期処理(オンライン)から、
- 別途スレッドを生成し、そのワーカースレッドで処理させたり、
 
- キューにキューイングして、バッチで処理させたり、
 
 
することになるが、対比するものが無いため非同期か?と言うと、
単なるバッチ処理やマルチスレッド処理、若しくは並列処理と言った方がイイかも知れない。
非同期処理の実装史  †
1. Thread、ThreadPool?  †
- 概要
- 従来の(プリミティブな)、マルチスレッド・プログラミング。
 
 
- 詳細
- スレッドの並列実行はOSが裏で無意識にしてくれていた。
- タイムスライスで細切れ/ラウンドロビンで論理的に並列実行。
 
- CPUのコア数に応じて、物理的に並列実行。
 
 
 
- しかし、以下の処理は意識的に実装する必要があった。
- 非同期処理をスレッド関数として分離して実装する。
 
- スレッド関数を作成したワーカースレッドに渡す。
 
- (必要に応じて)スレッド関数の結果をメインスレッドで待ち合わせる。
 
 
2. APM (Beginメソッド, Endメソッド)  †
- 概要
- 「前述のThread、ThreadPool」から非同期を意識したAPIを設計に変更した程度。
 
- 代表的なメソッド
- Streamクラスの、BeginRead? および EndRead? メソッド
 
- WebRequest?クラスの、BeginGetResponse? および EndGetResponse? メソッド
 
 
 
- 詳細
- Beginメソッドに Endメソッドのdelegate(≒callback)を渡す。
 
- 同期方法はクラスの実装に依る。
 
 
4. Future/Promise  †
- 詳細
- 非同期のcallbackを、delegateを引数に取るmethod chainに、匿名delegateで実装していく感じ。
 
- このコーディング・スタイルにより、あまりcallbackっぽく見えない同期に近いコーディングが可能。
 
- しかし、非同期処理の結果から、また非同期を呼び出すようなコードは上手く書けない。
 
 
- 参考
- 言語によってちょっと違うFuture/Promiseをまとめてみた
 
 
- 概要
- async/awaitで、同期呼び出し的に非同期処理を記述可能になった。
 
- 斬新な仕組みのため、無批判で浸透したが、昨今、振り返りフェーズにある気がする。
 
 
- 詳細
- Observer パターンを実装するフレームワークで、イベントや非同期処理をLINQっぽく扱える。
 
 
参考  †
SlideShare?  †
Tags: :プログラミング, :その他、開発の色々, :.NET開発