「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
非同期処理の実装方式について。
詳細 †
非同期処理の定義 †
- 一般的に、非同期処理と言うと、
同期処理(オンライン)との対比になり、
同期処理(オンライン)オンラインとの待ち合わせをする。
- 同期処理(オンライン)と待ち合わせをしない場合は、
同期処理(オンライン)から、
- 別途スレッドを生成し、そのワーカースレッドで処理させたり、
- キューにキューイングして、バッチで処理させたり、
することになるが、対比するものが無いため非同期か?と言うと、
単なるバッチ処理や副スレッド処理と言った方がイイかも知れない。
非同期処理の実装史 †
1. Thread、ThreadPool? †
従来の(プリミティブな)、マルチスレッド・プログラミング。
- スレッドの並列実行はOSが裏で無意識にしてくれていた。
- タイムスライスで細切れ/ラウンドロビンで論理的に並列実行。
- CPUのコア数に応じて、物理的に並列実行。
- しかし、以下の処理は意識的に実装する必要があった。
- 非同期処理をスレッド関数として分離して実装する。
- スレッド関数を作成したワーカースレッドに渡す。
- スレッド関数の結果をメインスレッドで待ち合わせる。
2. APM (Beginメソッド, Endメソッド) †
Beginメソッドに Endメソッドのdelegateを渡す。同期方法はクラスの実装に依る。
- 代表的なメソッド
- Streamクラスの、BeginRead? および EndRead? メソッド
- WebRequest?クラスの、BeginGetResponse? および EndGetResponse? メソッド
前述のAPMと同様に、Invokeメソッドにdelegateを渡す。同期方法はウィンドウ メッセージ。
4. Future/Promise †
- C#には無いが、JavaScriptのPromiseが有名。
非同期のcallbackを、delegateを引数に取るmethod chainに、匿名delegateで実装していく感じ。
- その他にも、JavaVM(Java、Scala)、C++などで標準ライブラリが提供されている模様。
async/awaitで、同期呼び出し的に非同期処理を記述可能になった。同期方法は同期コンテキストに依存する。
Observer パターンを実装するフレームワークで、イベントや非同期処理をLINQっぽく扱える。
参考 †
SlideShare? †
Tags: :プログラミング, :その他、開発の色々, :.NET開発