将List <t>内容添加到ConcurrentQueue <t>的最快方法

时间:2016-02-14 05:01:38

标签: c# concurrent-queue

我正在阅读this question并注意到OP正在迭代列表以将项目排队到ConcurrentQueue中。

ConcurrentQueue<TaskClass> cq = new ConcurrentQueue<TaskClass>();
for (int x = 0; x < TaskList.Count; x++)
    cq.Enqueue(TaskList[x]);

这有必要吗?

有没有办法:

  • 将大量对象添加到ConcurrentQueue或
  • 只需将输入的List转换/转换为ConcurrentQueue
  • 即可

1 个答案:

答案 0 :(得分:4)

您会注意到ConcurrentQueue<T>提供的constructor接受IEnumerable<T>并复制其内容,如下所示:

ConcurrentQueue<TaskClass> queue = new ConcurrentQueue<TaskClass>(TaskList);

为什么这比逐个列入每个项目更快?因为作为构造函数,它不受类型的线程安全保证的约束,因此,可以在不取消任何锁定的情况下添加项目(此外,如果查看源代码,您将看到Microsoft故意绕过某些{{1为了性能原因读取和写入字段。)

请参阅Reference Source以获取证明。

P.S。 除非您在紧密循环中创建大型并发队列,否则您不太可能在性能上看到明显的差异,但值得记住,如果您需要,复制构造函数就在那里。