Использование общего словаря внутри задачи (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 в этом случае? Даже если я сделаю так, чтобы ключи не повторялись на логическом уровне?

2 ответа

Решение

ConcurrentDictionary и блокировка НЕ ​​взаимозаменяемы или эквивалентны.

Добавление блокировки заставит все задачи записывать в словарь последовательно, по существу сводя на нет все преимущества параллельной обработки. Dictionary Класс также выдаст несколько загадочное исключение, если более двух потоков попытаются записать в него одновременно. Это потому, что разблокированный доступ повредит его внутренние структуры.

ConcurrentDictionary с другой стороны, позволяет всем задачам одновременно выполнять запись в словарь без необходимости блокировки. Наказанием является более медленная синхронная производительность по сравнению с разблокированной синхронной версией. В параллельных сценариях производительность и масштабируемость намного лучше.

Вы должны использовать синхронизацию, да. Просто lock было бы достаточно.

Другие вопросы по тегам