C# 線程安全集合類


 

 

 

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/kang_xuan/article/details/93979517
本文章僅為個人理解,如有錯誤請指正。

從.Net 4.0框架開始,在System.Collections.Concurrent命名空間下,增加了用於多線程協同的並發集合類(線程安全集合)。

線程安全集合:
就是當多線程訪問時,采用了加鎖的機制;即當一個線程訪問集合時,會對這個集合進行保護,其他線程不能對其訪問,直到該線程操作完集合之后,其他線程才可以使用。防止出現數據不一致或者數據被污染的情況。

只能保證集合的原子性、可見性,但是無法保證對集合操作的有序性,例如:多個線程同時將元素加入到集合,無法保證元素加入到集合的順序,多次運行情況結果會不同。

BlockingCollection<T>
提供具有阻塞和限制功能的線程安全集合,實現IProducerConsumerCollection<T>接口。支持容量大小的限制和完成添加限制,當標記為完成添加后只允許移除(Take)操作,無法進行添加(Add)操作。

BoundedCapacity:獲取集合限定容量,在通過構造函數時可以指定集合的容量大小。

IsAddingCompleted:判斷是否已經標記完成添加,

IsCompleted:判斷是否標記完成添加並且為空。

Add:將項添加到集合中。

CompleteAdding:將集合標記為完成添加。調用該函數后IsAddingCompleted為true,如果集合中包含的項數為0,那么IsCompleted也為true。

Take:從集合中移除一項。

TryAdd:嘗試將項加入集合

TryTake:嘗試從集合中移除項。

ConcurrentBag<T>
提供可供多個線程同時安全訪問的無序包。對應非泛型列表List<T>。

包(Bag)和數據上的集(Set)的區別是包可包含重復元素,而集中不能包含重復元素。

Count:獲取無序包中的元素數量

IsEmpty:判斷無序包是否為空。

TryPeek:從無序包中獲取一個元素,但不進行移除。

TryTask:從無序包獲取一個元素並移除。

ConcurrentDictionary<TKey,TValue>
提供可供多線程同時訪問的鍵值對的線程安全集合,對應Dictionary<TKey, TValue>。

IsEmpty:判斷字典是否為空。

AddOrUpdate:將鍵值對添加到字典中,如果Key值已經存在,則更新Value值。

Clear:將所有鍵值對從字典中移除。

GetOrAdd:如果鍵不存在,則將鍵值對添加到字典中並返回Value值,如果鍵已經存在,則返回現有值,不會更新現有值。

TryUpdate:嘗試更新鍵對應的Value值。

ConcurrentQueue<T>
隊列,提供線程安全的先進先出(FIFO)集合,對應Queue<T>。

Enqueue:將對象添加到隊列末尾處。

TryDequeue:嘗試移除並返回位於隊列開頭處的對象。

TryPeek:嘗試返回隊列開頭處的對象但不將其移除。

ConcurrentStack<T>
棧,提供線程安全的后進先出(LIFO)集合,對應Stack<T>

Push:將對象插入棧頂部。

PushRange:將多個對象插入棧的頂部。

TryPeek:嘗試返回棧頂部的對象但不將其移除。

TryPop:嘗試彈出並返回棧頂部的對象。

TryPopRange:嘗試彈出並返回棧頂部的多個對象。
————————————————
版權聲明:本文為CSDN博主「玄之」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/kang_xuan/article/details/93979517

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM