gpt4 book ai didi

c# - BlockingCollection with Parallel.For 挂起?

转载 作者:太空狗 更新时间:2023-10-30 00:30:31 27 4
gpt4 key购买 nike

我正在尝试使用 BlockingCollection 来尝试更好地理解它们,但我很难理解为什么我的代码在我使用 Parallel 时处理完所有项目时挂起.对于

我只是在其中添加一个数字(制作人?):

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() 通知集合您已完成向其添加项目。 .例如:

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

blockingCollection.CompleteAdding();

关于c# - BlockingCollection with Parallel.For 挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35617114/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com