Существует так много сбоев может произойдет, если вы хотите обновить список и прочитать его в многопоточном коде, например, допустим, что у нас есть следующий сценарий:
//c#
List<object> myList...
//at reading thread
if (myList.Count > 0)
{
object item = myList[0];//get the item at the first index of the collection.
}
//at writing thread
myList.Clear();
Поток записи обновляет список одновременно с тем, что поток чтения читает из списка, поэтому предположим, что выполнение было следующим:Поток читателя проверяет, есть ли элементы в коллекции, и обнаруживает, что в нем есть какие-то элементы ".Count > 0
true", поэтому он продолжает работу, но до достижения следующей строки переключение контекста потока приостанавливает поток чтения, переключаясь на поток записи, поэтому он выполняет свой код myList.Clear();
, после чего контекст потока переключается обратно на поток чтения, чтобы продолжить выполнение, поэтому он пытается получить myList[0]
, ноколлекция была пустой в тот момент потоком записи, поэтому он завершится ошибкой с исключением IndexOutOfRange
..
Другой сценарий: если поток чтения, где выполняется итерация, создает коллекцию с использованием foreach
, а поток записи простоизменяет коллекцию, «добавляя / удаляя» некоторые элементы, она снова генерирует исключение из-за изменения коллекции во время зацикливанияC # или использование Monitor
класса. Однако, если вы используете 4.0
, вы можете отключить использование ConcurrentCollection
вместо обычных списков - это потокобезопасные коллекции.