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



我有以下代码:

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吗?即使我确保密钥不会在逻辑级别上重复?

ConcurrentDictionary和locking不能互换或等效。

添加锁将强制所有任务按顺序写入字典,实质上否定了并发处理带来的任何好处。如果有两个以上的线程试图同时写入Dictionary类,那么它还会抛出一个有点神秘的异常。这是因为未锁定的访问将破坏其内部结构。

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

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

相关内容

  • 没有找到相关文章

最新更新