我正在玩BlockingCollection
尝试更好地理解它们,但我很难理解为什么当我使用Parallel.For
我只是添加一个数字(生产者?):
var blockingCollection = new BlockingCollection<long>();
Task.Factory.StartNew(() =>
{
while (count <= 10000)
{
blockingCollection.Add(count);
count++;
}
});
然后我尝试处理(消费者?):
Parallel.For(0, 5, x =>
{
foreach (long value in blockingCollection.GetConsumingEnumerable())
{
total[x] += 1;
Console.WriteLine("Worker {0}: {1}", x, value);
}
});
但是当它处理完所有数字后,它就挂在那里?我究竟做错了什么?
另外,当我将 Parallel.For 设置为 5 时,这是否意味着它正在 5 个单独的线程上处理数据?
顾名思义,操作BlockingCollection<T>
当他们无能为力时阻止,这包括GetConsumingEnumerable()
.
原因是集合无法判断您的生产者是否已经完成,或者只是忙于生产下一个项目。
您需要做的是通过调用通知集合您已完成向其中添加项目CompleteAdding() https://msdn.microsoft.com/en-us/library/dd287086。例如:
while (count <= 10000)
{
blockingCollection.Add(count);
count++;
}
blockingCollection.CompleteAdding();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)