Thi*_*rry 4 c# parallel-processing multithreading task-parallel-library parallel.for
我正在BlockingCollection努力尝试更好地理解它们,但是我在努力理解为什么当我使用Parallel.For
我只是在上面加上一个数字(生产者?):
var blockingCollection = new BlockingCollection<long>();
Task.Factory.StartNew(() =>
{
while (count <= 10000)
{
blockingCollection.Add(count);
count++;
}
});
Run Code Online (Sandbox Code Playgroud)
然后,我正在尝试处理(消费者?):
Parallel.For(0, 5, x =>
{
foreach (long value in blockingCollection.GetConsumingEnumerable())
{
total[x] += 1;
Console.WriteLine("Worker {0}: {1}", x, value);
}
});
Run Code Online (Sandbox Code Playgroud)
但是,当完成所有数字的处理后,它就挂在那里了吗?我究竟做错了什么?
另外,当我将Parallel.For设置为5时,是否表示它正在5个单独的线程上处理数据?
顾名思义,操作在BlockingCollection<T>无法执行任何操作时会阻塞,其中包括GetConsumingEnumerable()。
这样做的原因是,收藏集无法告知您的制作人是否已经完成制作,或者只是忙于制作下一个作品。
您需要做的是通过调用通知集合您已完成向集合中添加项目的操作CompleteAdding()。例如:
while (count <= 10000)
{
blockingCollection.Add(count);
count++;
}
blockingCollection.CompleteAdding();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
746 次 |
| 最近记录: |