В коллекцию постоянно добавляются сообщения об изменении в программе и мне нужно выводить эти изменения в textbox. Для этого использую метод Print, где получаю строку для вывода.
class Journal
{
// Коллекция для событий
private 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
...
foreach (CollectionHandlerEventArgs j in journal.ToArray())
{
s += j.Name + ": " + j.Type_of_Change + "
";
}
Комментариев нет:
Отправить комментарий