我有以下代码:
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
就足够了。