2016-02-14 33 views
2

我正在讀this question,並注意到OP正在迭代列表以將項目排入ConcurrentQueue。最快的方式添加列表<T>內容併發隊列<T>

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

這是必要的嗎?

有沒有一種辦法之一:

  • 添加大量的對象爲ConcurrentQueue,或
  • 簡單地轉換/蒙上了類型化的列表爲ConcurrentQueue

回答

4

你會注意到ConcurrentQueue<T>提供了constructor,它接受IEnumerable<T>並複製其內容,如下所示:

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

爲什麼這會比逐個排列每個項目更快?因爲作爲構造函數,它不受該類型的線程安全保證限制,因此可以避免添加項目而無需取出任何鎖定(另外,如果查看源代碼,您將看到Microsoft有意繞過某些volatile字段讀取併爲了完整的原因寫入)。

請參閱Reference Source的證明。

P.S. 除非您在緊密循環中創建大型併發隊列,否則您不太可能觀察到性能上的顯着差異,但值得記住的是,如果需要,複製構造函數在那裏。