0

我有以下代码:

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());

在这种情况下我应该使用 aConcurrentDictionary而不是 a吗?Dictionary即使我确保键不会在逻辑级别上重复?

4

2 回答 2

2

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

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

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

于 2013-07-15T10:37:16.687 回答
1

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

于 2013-07-14T12:54:57.850 回答