我正在阅读this question并注意到OP正在迭代列表以将项目排队到ConcurrentQueue中。
ConcurrentQueue<TaskClass> cq = new ConcurrentQueue<TaskClass>();
for (int x = 0; x < TaskList.Count; x++)
cq.Enqueue(TaskList[x]);
这有必要吗?
有没有办法:
答案 0 :(得分:4)
您会注意到ConcurrentQueue<T>
提供的constructor接受IEnumerable<T>
并复制其内容,如下所示:
ConcurrentQueue<TaskClass> queue = new ConcurrentQueue<TaskClass>(TaskList);
为什么这比逐个列入每个项目更快?因为作为构造函数,它不受类型的线程安全保证的约束,因此,可以在不取消任何锁定的情况下添加项目(此外,如果查看源代码,您将看到Microsoft故意绕过某些{{1为了性能原因读取和写入字段。)
请参阅Reference Source以获取证明。
P.S。 除非您在紧密循环中创建大型并发队列,否则您不太可能在性能上看到明显的差异,但值得记住,如果您需要,复制构造函数就在那里。