ParallelとTask(aync, await)の違い

f:id:varmil:20151119232319p:plain

I/O待ちをするような処理は、非同期版のメソッドを使って、スレッドを作らずに待つことが重要

(非同期版 = Taskクラス+async, awaitによる「待機可能」な書き方のこと)

Parallel.ForEach(Common.GetQueries(context, keys), q => 
{ 
    var ret = q.Execute(); // 別スレッドを立てて、その中で同期実行(I/O待ち)
    lock (w) Common.Output(ret, w); 
}); 

のようにスレッドプールを利用して ブロッキング する書き方をしてしまうと、大量のスレッドが生成されてそれらの大半が休眠状態になるので無駄が多い。

ので async, await などスレッドを開放できる書き方をすべきである。

非同期I/O待ち | C#たんっ!


  • データ並列: Parallelクラス
  • 非同期制御フロー: 非同期メソッド(async/awaitキーワード)
  • 非同期データフロー: TPL Dataflowライブラリ

それぞれ別物

www.atmarkit.co.jp


f:id:varmil:20151119225747p:plain

omiya6048.hatenablog.com