我刚刚开始了解一些新的 .NET 并发集合,例如 ConcurrentDictionary 和 ConcurrentQueue,并且我正在运行一些测试以查看当我并行写入队列时会发生什么。
所以我运行了这个:
private static void ParallelWriteToQueue(Queue<int> queue)
{
Stopwatch sw = Stopwatch.StartNew();
Parallel.For(1,1000001,(i) => queue.Enqueue(i));
sw.Stop();
Console.WriteLine("Regular int Queue - " + queue.Count + " time" + sw.ElapsedMilliseconds);
}
正如我认为我得到了下一个例外:
Source array was not long enough. Check srcIndex and length, and the array's lower bounds.
所以这个队列不能像预测的那样处理并发的入队。
但是,当我将队列的类型更改为字符串时,没有异常,结果写成类似
Regular string Queue - 663209 time117
这意味着只有大约 663k 被排队。
为什么没有例外?
所有未排队的项目发生了什么?
这是与队列相同的功能
private static void ParallelWriteToQueue(Queue<string> queue)
{
Stopwatch sw = Stopwatch.StartNew();
Parallel.For(1, 100001, (i) => queue.Enqueue(i.ToString()));
sw.Stop();
Console.WriteLine("Regular string Queue - " + queue.Count + " time" + +sw.ElapsedMilliseconds);
}