BlockingCollection与Parallel.For挂起?

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个单独的线程上处理数据?

svi*_*ick 5

顾名思义,操作在BlockingCollection<T>无法执行任何操作时会阻塞,其中包括GetConsumingEnumerable()

这样做的原因是,收藏集无法告知您的制作人是否已经完成制作,或者只是忙于制作下一个作品。

您需要做的是通过调用通知集合您已完成向集合中添加项目的操作CompleteAdding()。例如:

while (count <= 10000)
{
    blockingCollection.Add(count);
    count++;
}

blockingCollection.CompleteAdding();
Run Code Online (Sandbox Code Playgroud)