マイクロソフト系技術情報 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)を渡す。
    • 同期方法はクラスの実装に依る。

3. EAP (Control.Invoke、.BeginInvoke)

4. Future/Promise

  • 概要
    • C#には無いが、JavaScriptのPromiseが有名。
    • その他にも、JavaVM(Java、Scala)、C++などで標準ライブラリが提供されている模様。
  • 詳細
    • 非同期のcallbackを、delegateを引数に取るmethod chainに、匿名delegateで実装していく感じ。
    • このコーディング・スタイルにより、あまりcallbackっぽく見えない同期に近いコーディングが可能。
    • しかし、非同期処理の結果から、また非同期を呼び出すようなコードは上手く書けない。

5. TAP (async/await)

  • 概要
    • async/awaitで、同期呼び出し的に非同期処理を記述可能になった。
    • 斬新な仕組みのため、無批判で浸透したが、昨今、振り返りフェーズにある気がする。

6. Reactive Extensions(Rx)

  • 概要
    • Silverlight Toolkitに"System.Reactive.dll"が同梱されたのをきっかけに始まり各言語に広まった。
    • 「状態変化を検知して非同期イベントを発火」のようなライブラリなので、
      業務系にはミスマッチと思われる。ゲーム業界などでは使われている模様。
  • 詳細
    • Observer パターンを実装するフレームワークで、イベントや非同期処理をLINQっぽく扱える。

参考

SlideShare?

Rx + async Task


Tags: :プログラミング, :その他、開発の色々, :.NET開発


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-10-05 (金) 19:07:01 (47d)