Страницы

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

среда, 22 января 2020 г.

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

#c_sharp #коллекции #итераторы


В коллекцию постоянно добавляются сообщения об изменении в программе и мне нужно
выводить эти изменения в 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 + "\n";
        }
        return s;
    }
}


Нашел ошибку в том, что во время итерации нельзя изменять коллекцию, однако мне необходимо
это сделать. Как исправить?
    


Ответы

Ответ 1



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

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

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