Concurrent类下的集合与普通集合使用上并无本质区别,主要为多线程读取单线程写入设计,开销比普通集合稍大。 使用Concurrent命名空间下的集合可以减少lock使用,极大的降低产生死锁的可能性。
常用并发集合与普通集合对照表
Generic集合 | Concurrent集合 | 并发集合说明 |
---|---|---|
Queue<T> | ConcurrentQueue<T> | 表示线程安全的先进先出 (FIFO) 集合。 |
List<T> | ConcurrentBag<T> | 表示对象的线程安全的无序集合。 |
Dictionary<TKey, TValue> | ConcurrentDictionary<TKey, TValue> | 表示可由多个线程同时访问的键/值对的线程安全集合。 |
Stack<T> | ConcurrentStack<T> | 表示线程安全的后进先出 (LIFO) 集合。 |
并发集合具体使用方法请参考MSDN,需要注意的是并发集合在可能产生资源竞争时使用了Try方法并返回是否成功修改集合的布尔值。
列如,数据加入队列和普通集合并无区别
public static ConcurrentQueue<NET.Login.Request> LoginQueue = new ConcurrentQueue<NET.Login.Request>();
//...
while (true)
{
try
{
//数据获取处理省略...
//登录请求加入待处理队列
Model.Info.LoginQueue.Enqueue(loginreq);
}
//以下省略...
}
在获取数据并处理时
//省略...
while (true)
{
Model.NET.Login.Request quser;
try
{
if (Model.Info.LoginQueue.TryDequeue(out quser))
{
//quser为从队列中取出的数据,成功取出则开始数据处理
这样在多线程并发处理上基本不用考虑lock操作,极大提高了代码效率。
当然笔者为新手码农,欢迎dalao指点。