关于集合的并发处理

MSDN参考System.Collections.Concurrent 命名空间

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指点。