2014-10-16 47 views
1

我有兩個詞典列表。我將針對每個線程查詢一個用戶,最多可達50個用戶/線程。線程安全列表或連續多個列表?

第一個列表「users」每個線程只包含一個條目。 第二個列表「items」每個線程可能包含數千個條目(300是一個好的平均值)。現在,我在單個線程中按順序查詢用戶:首先,收集一個用戶的數據(這是同步實現的,包括約100ms的純等待),然後用戶將被添加到「用戶」 ,然後每個項目將被一次處理一個,並添加到「項目」(處理需要大約十幾毫秒的1000個項目)。

雖然訂購了這些清單,但我不必保留任何訂單。

現在我認爲如下:

  • 第一個列表是一個ConcurrentBag的好地方。
  • 對於第二個列表,最好使用多個列表,每個線程一個,最後連在一起。

但是在我繼續這樣做之前,我想問問你這是最好的方法,還是你能想出更好的解決方案。在待並行化的部分中,我不會對任何列表執行任何操作,但會添加項目。

+0

爲什麼每個線程查詢一個用戶是否有特殊原因?在不知道應用程序的設置/設計的情況下,除了多線程外,沒有其他理由的線程看起來像是很多線程。 – Joeb454 2014-10-16 13:35:16

+0

@ Joeb454我們查詢的原始API(來自其他供應商)的設計允許每次調用只請求一個用戶,因爲每個用戶的數據可能存儲在不同的端點上。 – Alexander 2014-10-16 13:58:47

回答

2

根據此Thread-Safe Collections文章,System.Collections.Concurrent命名空間(其中包括ConcurrentBag)中的任何集合都應該適合您的多線程需求。

我可以從經驗中得知,在簡單的Dictionary(位於System.Collections.Generic命名空間中)周圍使用lock可以很好地處理大型內存中只添加收集。在生產中,它定期持有數百萬件沒有問題的物品,即使是定期處理以消除「過期」物品。

所以底線,你不應該求助於建立項目的50個單獨的列表,然後連接它們。但是,當然,這種方法也可能工作得很好。它可能會下降到你個人認爲最方便的地方。