ParallelとTask(aync, await)の違い
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
などスレッドを開放できる書き方をすべきである。
それぞれ別物