Open棟梁Project - マイクロソフト系技術情報 Wiki
目次 †
概要 †
非同期処理の実装史 †
1. Thread、ThreadPool? †
従来の、マルチスレッド・プログラミング。
- スレッドの並列実行はOSが裏で無意識にしてくれていた。
- タイムスライスで細切れ/ラウンドロビンで論理的に並列実行。
- CPUのコア数に応じて、物理的に並列実行。
- しかし、以下の処理は意識的に実装する必要があった。
- 非同期処理をスレッド関数として分離して実装する。
- スレッド関数を作成したワーカースレッドに渡す。
- スレッド関数の結果をメインスレッドで待ち合わせる。
2. APM、EAP (Control.Invoke、.BeginInvoke?) †
「Windowsメッセージングキュー(Control.Invoke、.BeginInvoke?)」による方式。
この非同期処理方式では、
- Foregroundスレッド(UIスレッド)からBackgroundスレッドを使用して非同期処理を実行し、
- 非同期処理の実行結果をUIスレッドを使用して画面に反映させる事ができる。
Open棟梁の「非同期呼出フレームワーク」がこの方式で実装されている。
async/awaitは、TAP(Task-based Asynchronous Pattern)の方式で実装されている。
概要 †
- async/awaitの登場で、マルチスレッド処理として実装しなくても、
非同期処理を同期型処理と、ほぼ変わらない記述で容易に実装可能になった。
- awaitの意味は、スレッドを止めずノンブロッキングで非同期から同期に復帰するという意味らしい。
実際、async/awaitはそういう動きをする。
- しかし、その実態はとても複雑、詳しくはコチラを参照。
- 内部がどう動いているか詳しく把握せんとシステムは安定しない、
- 中身をシッカリ理解して使用している人が少ないので注意。
余談? †
async/awaitの夫々の意味。
- async修飾子
asyncは、呼び出し元と同じ同期コンテキストで実行されることを示す。
- await演算子
asyncをawaitすると、スレッドを止めずに同期コンテキストで同期する。
この動作は想像し難いが、具体的には、
- 同じ同期コンテキスト(Windowsメッセージングキュー)に
- コールバックを順番に並べる(Control.BeginInvoke?()的な)。
というイメージ。
- ・・・結局、APM、EAPを使ってるじゃねーか的な。
- 同期コンテキストの種類によって、動きも異なる。
- 同期コンテキストはキュー的なもので実装されている。
- 例えば、前述の、Windowsメッセージングキュー、ThreadPool?などなど。
なので、言葉尻だけで動作を想像し難い。
Tags: :.NET開発