Пишу класс для регистрации событий. Мой LogClass реализован как одноэлементный, и любой класс в системе может делать запись в журнале. Записи хранятся в списке и при заполнении буфера выгружаются на диск.
Я использую DataGridView для отображения содержимого LogClass во время выполнения, поэтому я использовал BindingList, чтобы средство просмотра обновлялось автоматически.
Мне интересно, насколько потокобезопасен мой класс. Я использую «блокировку» каждый раз, когда добавляю новую запись в список, и когда я просматриваю список, чтобы выгрузить ее на диск. Помимо DataGridView, класс в основном предназначен только для записи, потому что нет возможности читать из журнала, только для добавления записей в журнал. Дамп выполняется внутренне, и это единственный раз, когда в BindingList есть явная команда чтения.
Итак, меня действительно беспокоит то, что происходит с DataGridView и BindingList? BindingList генерирует событие каждый раз, когда список изменяется. Это не похоже на проблему при добавлении новых записей, потому что событие генерируется, когда добавление завершено.
Мой код для Dump ():
lock (lockObj) {
foreach (LogEntry le in List) {
writeToDisk(le)
removeFromList(le)
}
}
Несмотря на то, что я блокирую список на протяжении всей итерации, в Viewer выдается событие о том, что список изменился (из-за удаления) и, следовательно, считывается DataGridView. Я действительно не хочу, чтобы что-либо читало / записывало в список, пока я его изменяю. Любые идеи?