Страницы

Поиск по вопросам

воскресенье, 10 марта 2019 г.

Как безопасно добавить элементы в коллекцию при использовании итератора?

В коллекцию постоянно добавляются сообщения об изменении в программе и мне нужно выводить эти изменения в textbox. Для этого использую метод Print, где получаю строку для вывода.
class Journal { // Коллекция для событий private List journal = new List();
// Добавить событие в коллекцию public void Add(string Name, string Type_of_Change) { journal.Add(new CollectionHandlerEventArgs(Name, Type_of_Change)); }
// Обработчик изменений на сервере public void ServerChanged(CollectionHandlerEventArgs e) { CollectionHandlerEventArgs je = new CollectionHandlerEventArgs(e.Name, e.Type_of_Change); journal.Add(je); }
// Обработчик изменений клиента public void ClientChanged(CollectionHandlerEventArgs e) { CollectionHandlerEventArgs je = new CollectionHandlerEventArgs(e.Name, e.Type_of_Change); journal.Add(je); }
// Получение строки с изменениями public string Print() { string s = null; foreach (CollectionHandlerEventArgs j in journal) { s += j.Name + ": " + j.Type_of_Change + "
"; } return s; } }
Нашел ошибку в том, что во время итерации нельзя изменять коллекцию, однако мне необходимо это сделать. Как исправить?


Ответ

Ошибка вызвана изменениями в списке в то время, когда существует энумератор этого списка. В цикле for никакого энумератора не создается.
for (int i = 0; i < journal.Count; i++) { CollectionHandlerEventArgs item = journal[i]; s += item.Name + ": " + item.Type_of_Change + "
"; }
Потоко-безопасный вариант:
private ConcurrentBag journal = new ConcurrentBag();
...
foreach (CollectionHandlerEventArgs j in journal.ToArray()) { s += j.Name + ": " + j.Type_of_Change + "
"; }

Комментариев нет:

Отправить комментарий