Dot-Net-4.0

ConcurrentBag<T> 的實際用途是什麼?

  • July 20, 2012

ConcurrentBag 將允許多個執行緒從包中添加和刪除項目。執行緒可能會將一個項目添加到包中,然後最終將相同的項目重新取出。它說 ConcurrentBag 是無序的,但它有多無序?在單個執行緒上,袋子就像一個堆棧。無序是否意味著“不像鍊錶”?

ConcurrentBag 在現實世界中的用途是什麼?

包對於跟踪實例計數非常有用。例如,如果您想記錄您正在為哪些主機提供 Web 請求服務,您可以在開始為請求提供服務時將其 IP 添加到包中,並在完成後將其刪除。

使用包可以讓您一目了然地知道您目前正在服務哪些 IP。它還可以讓您快速查詢您是否在為給定的 IP 地址提供服務。

如果你為此使用一個集合而不是一個包,那麼來自同一個 IP 地址的多個並發請求會弄亂你的記錄保存。

因為沒有排序,所以 ConcurrentBag 比 ConcurrentStack/Queue 具有性能優勢。它由 Microsoft 實現為本地執行緒儲存。因此,每個添加項目的執行緒都在它自己的空間中執行此操作。檢索項目時,它們來自本地儲存。只有當它為空時,執行緒才會從另一個執行緒儲存中竊取項目。因此,ConcurrentBag 不是一個簡單的列表,而是一個分佈式項目列表。並且幾乎是無鎖的,並且應該在高並發下更好地擴展。

不幸的是,在 .NET 4.0 中存在性能問題(在 4.5 中已修復)請參閱 <http://ayende.com/blog/156097/the-high-cost-of-concurrentbag-in-net-4-0>

引用自:https://stackoverflow.com/questions/6447290