Сбой списка Naudio Reader<WaveStream> [Состояние гонки]
У меня есть Webstream reader<WaveStream> list
и я располагаю WaveStream, используя цикл foreach, как указано ниже
foreach (WaveStream ws in readers)
ws.Dispose();
но reader<WaveStream> list
модифицируется другим методом в то же время, когда цикл foreach, удаляющий объект, следовательно, мы получили необработанную коллекцию исключений, был изменен другим методом, и наше приложение упало
Не могли бы вы предоставить какое-нибудь объяснение или ссылку с объяснением, как наша проблема сбоев решалась после использования цикла for, как указано ниже?
for (int i = 0; i <= readers.ToArray().Length - 1; i++)
{
readers[i].Dispose();
}
Я не могу понять, как для цикла и readers.ToArray()
решена проблема сбоя.
1 ответ
Если List<T>
изменяется, пока вы foreach
через него вы получите исключение, так как основная коллекция изменилась. Таким образом, в вашем случае либо другой поток изменял список, пока вы итерировали его, либо само действие "Распределение потоков" модифицировало список. По телефону ToArray
Вы создаете новый массив, который является копией исходного списка. Никто другой не имеет доступа к этому массиву, поэтому его содержимое не изменится, пока вы выполняете его.