C# 当一个ConcurrentBag中只有两个项目时,处理一个ConcurrentBag会显示超过5000个任务

C# 当一个ConcurrentBag中只有两个项目时,处理一个ConcurrentBag会显示超过5000个任务,c#,C#,在Microsoft上找到以下ConcurrentBag示例 我正在调试一个单元测试,并四处检查,任务中有5000多个项目。这正常吗?这个袋子只有两个袋子 HashSet x=newhashset(); List BagConsumerTasks=新列表(); int itemsInBag=0; 而(!result.IsEmpty) { BagConsumerTasks.Add(Task.Run)(()=> { 字符串项; if(结果-尝试提取(项目外)) { x、 增加(项目); items

在Microsoft上找到以下ConcurrentBag示例

我正在调试一个单元测试,并四处检查,任务中有5000多个项目。这正常吗?这个袋子只有两个袋子

HashSet x=newhashset();
List BagConsumerTasks=新列表();
int itemsInBag=0;
而(!result.IsEmpty)
{
BagConsumerTasks.Add(Task.Run)(()=>
{
字符串项;
if(结果-尝试提取(项目外))
{
x、 增加(项目);
itemsInBag++;
}
}));
}
Task.WaitAll(bagsumetasks.ToArray());

在检查
结果。IsEmpty
和使用项目的任务之间存在竞争,导致代码启动的任务多于需要的任务

许多任务并行地增加局部变量
itemsInBag
,这也是一种竞争,但通过在其前面调用
Console.WriteLine
可以缓解这种竞争

虽然在某些情况下这可能是一个bug,但我猜任务的过度调度在这里可能是故意的,以演示在高争用下运行的类

因为没有其他东西在使用并发包,所以示例可以创建固定数量的任务:

    List<Task> bagConsumeTasks = new List<Task>();
    int itemsInBag = 0;
    for (int i = 0; i < 500; i++)
    {
        bagConsumeTasks.Add(Task.Run(() =>
        {
            int item;
            if (cb.TryTake(out item))
            {
                Console.WriteLine(item);
                Interlocked.Increment(ref itemsInBag);
            }
        }));
    }
    Task.WaitAll(bagConsumeTasks.ToArray());
List=new List();
int itemsInBag=0;
对于(int i=0;i<500;i++)
{
BagConsumerTasks.Add(Task.Run)(()=>
{
国际项目;
if(cb.TryTake(外项目))
{
控制台写入线(项目);
联锁增量(参考项目sinbag);
}
}));
}
Task.WaitAll(bagsumetasks.ToArray());

在检查
结果。IsEmpty
和使用项目的任务之间存在竞争,导致代码启动的任务多于需要的任务

许多任务并行地增加局部变量
itemsInBag
,这也是一种竞争,但通过在其前面调用
Console.WriteLine
可以缓解这种竞争

虽然在某些情况下这可能是一个bug,但我猜任务的过度调度在这里可能是故意的,以演示在高争用下运行的类

因为没有其他东西在使用并发包,所以示例可以创建固定数量的任务:

    List<Task> bagConsumeTasks = new List<Task>();
    int itemsInBag = 0;
    for (int i = 0; i < 500; i++)
    {
        bagConsumeTasks.Add(Task.Run(() =>
        {
            int item;
            if (cb.TryTake(out item))
            {
                Console.WriteLine(item);
                Interlocked.Increment(ref itemsInBag);
            }
        }));
    }
    Task.WaitAll(bagConsumeTasks.ToArray());
List=new List();
int itemsInBag=0;
对于(int i=0;i<500;i++)
{
BagConsumerTasks.Add(Task.Run)(()=>
{
国际项目;
if(cb.TryTake(外项目))
{
控制台写入线(项目);
联锁增量(参考项目sinbag);
}
}));
}
Task.WaitAll(bagsumetasks.ToArray());

这是一个特殊的例子。在某些地方,这已经被复制粘贴到了生产代码中。这不是一个很好的例子。将有数千个启动的任务从cb.TryTake()获得错误返回。只有在他们中的500人设法跑开并清空袋子后,这种情况才会停止。有一种方法可以衡量这台机器有多少个处理器核:)微软在MSDN文档和示例上投入了大量资源,但在.NET 2.0之后就消失了,这是一个特殊的例子。在某些地方,这已经被复制粘贴到了生产代码中。这不是一个很好的例子。将有数千个启动的任务从cb.TryTake()获得错误返回。只有在他们中的500人设法跑开并清空袋子后,这种情况才会停止。好的,一种衡量机器有多少处理器内核的方法:)微软在MSDN文档和示例上投入了大量资源,但在.NET2.0之后,这些资源逐渐消失