スティーブン・トーブの本の88ページ
http://www.microsoft.com/download/en/details.aspx?id=19222
コードがあります
private BlockingCollection<T> _streamingData = new BlockingCollection<T>();
// Parallel.ForEach
Parallel.ForEach(_streamingData.GetConsumingEnumerable(),
item => Process(item));
// PLINQ
var q = from item in _streamingData.GetConsumingEnumerable().AsParallel()
...
select item;
スティーブンはそれから言及します
「GetConsumingEnumerableをデータソースとして呼び出した結果をParallel.ForEachに渡す場合、コレクションが空になると、ループで使用されるスレッドがブロックされる可能性があります。ブロックされたスレッドは、Parallel.ForEachによって解放されない場合があります。このように、上記のコードでは、コレクションが空である期間がある場合、プロセスのスレッド数が着実に増加する可能性があります。」
なぜスレッド数が増えるのかわかりませんか?
コレクションが空の場合、blockingcollectionはそれ以上のスレッドを要求しませんか?
したがって、BlockingCollectionで使用されるスレッドの数を制限するためにWithDegreeOfParallelismを実行する必要はありません。