Произошло исключение InvalidOperationException. Коллекция была изменена
Я понял, что эта ошибка возникла в первую очередь из-за проблем с потокобезопасностью в статическом словаре, который я использовал.
Небольшая предыстория: в настоящее время у меня есть приложение, в котором есть 3 разных метода, связанных с этой проблемой.
- Метод A перебирает словарь с помощью foreach и возвращает значение.
- Метод B добавляет данные в словарь.
- Метод C изменяет значение ключа в словаре.
Цель: Моя основная цель — чтобы полностью удалить исключение
Для метода B (который добавляет новый ключ в словарь) я заменил .Add на TryAdd
Для метода C (который обновляет значение словаря) я не вносил никаких изменений. Грубый набросок кода выглядит следующим образом:
Код: Выделить всё
static public int ChangeContent(int para)
{
foreach (KeyValuePair pair in static_container)
{
if (pair.Value.propA != para ) //Pending cancel
{
pair.Value.data_id = prim_id; //I am updating the content
return 0;
}
}
return -2;
}
Код: Выделить всё
static public CustObject RetrieveOrderDetails(int para)
{
foreach (KeyValuePair pair in static_container)
{
if (pair.Value.cust_id.Equals(symbol))
{
if (pair.Value.OrderStatus != para)
{
return pair.Value; //Found
}
}
}
return null; //Not found
}
Изменить:
На этой странице указано, что метод GetEnumerator позволяет проходить по элементам параллельно с записью (хотя он может быть устаревшим). Разве это не то же самое, что использовать foreach?
Подробнее здесь: https://stackoverflow.com/questions/149 ... dification