2

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

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

这是必要的吗?

有没有办法:

  • 将大量对象添加到 ConcurrentQueue,或
  • 只需将类型化的 List 转换/转换为 ConcurrentQueue
4

1 回答 1

5

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

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

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

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

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

于 2016-02-14T05:22:04.393 回答