在斯蒂芬图布的书的第 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 释放回 ThreadPool “
我不明白为什么线程数会增加?
如果集合为空,那么blockingcollection 不会请求任何进一步的线程吗?
因此,您不需要使用 WithDegreeOfParallelism 来限制 BlockingCollection 上使用的线程数