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

Joh*_*ohn 2 c# concurrent-queue

我正在阅读这个问题并注意到 OP 正在迭代一个列表以将项目排队到 ConcurrentQueue 中。

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

这是必要的吗?

有没有办法:

  • 将大量对象添加到 ConcurrentQueue,或
  • 只需将类型列表转换/转换为 ConcurrentQueue

Kir*_*kiy 5

您会注意到它ConcurrentQueue<T>提供了一个接受 an并复制其内容的构造函数IEnumerable<T>,如下所示:

ConcurrentQueue<TaskClass> queue = new ConcurrentQueue<TaskClass>(TaskList);
Run Code Online (Sandbox Code Playgroud)

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

请参阅参考来源以获取证明。

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