Использование общего словаря внутри задачи (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
было бы достаточно.