C# 当一个ConcurrentBag中只有两个项目时,处理一个ConcurrentBag会显示超过5000个任务
在Microsoft上找到以下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
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之后,这些资源逐渐消失