在任务(TPL)中使用通用字典

时间:2013-07-14 12:26:52

标签: c#-4.0 task-parallel-library concurrent-collections

我有以下代码:

Dictionary<string, WSResponse> responseDictionary = new Dictionary<string, WSResponse>();
List<Task> taskList = new List<Task>();
            foreach (string ID in IDs)
            {
                string localID = ID;

                Task newTask = Task.Factory.StartNew(() =>
                {
                    WSResponse response = Query.GetListFor(localID);                    
                    responseDictionary.Add(localID, response);
                });
                taskList.Add(newTask);
            }


            Task.WaitAll(taskList.ToArray());

在这种情况下,我应该使用ConcurrentDictionary而不是Dictionary吗?即使我确保密钥不在逻辑层重复?

2 个答案:

答案 0 :(得分:2)

ConcurrentDictionary和锁定不可互换或等效。

添加锁将强制所有任务按顺序写入字典,从根本上否定了并发处理可能带来的任何好处。如果两个以上的线程试图同时写入它,Dictionary类也会引发一些有点神秘的异常。这是因为解锁访问会破坏其内部结构。

另一方面,ConcurrentDictionary允许所有任务同时写入字典而无需锁定。与解锁的同步版本相比,惩罚是同步性能较慢。但在并发场景中,性能和可伸缩性要好得多。

答案 1 :(得分:1)

你应该使用同步,是的。一个简单的lock就足够了。