Рекомендации по безопасности потоков при использовании DataGridView и BindingList в C #

Пишу класс для регистрации событий. Мой LogClass реализован как одноэлементный, и любой класс в системе может делать запись в журнале. Записи хранятся в списке и при заполнении буфера выгружаются на диск.

Я использую DataGridView для отображения содержимого LogClass во время выполнения, поэтому я использовал BindingList, чтобы средство просмотра обновлялось автоматически.

Мне интересно, насколько потокобезопасен мой класс. Я использую «блокировку» каждый раз, когда добавляю новую запись в список, и когда я просматриваю список, чтобы выгрузить ее на диск. Помимо DataGridView, класс в основном предназначен только для записи, потому что нет возможности читать из журнала, только для добавления записей в журнал. Дамп выполняется внутренне, и это единственный раз, когда в BindingList есть явная команда чтения.

Итак, меня действительно беспокоит то, что происходит с DataGridView и BindingList? BindingList генерирует событие каждый раз, когда список изменяется. Это не похоже на проблему при добавлении новых записей, потому что событие генерируется, когда добавление завершено.

Мой код для Dump ():

lock (lockObj) {
    foreach (LogEntry le in List) {
      writeToDisk(le)
      removeFromList(le)
    }
 }

Несмотря на то, что я блокирую список на протяжении всей итерации, в Viewer выдается событие о том, что список изменился (из-за удаления) и, следовательно, считывается DataGridView. Я действительно не хочу, чтобы что-либо читало / записывало в список, пока я его изменяю. Любые идеи?


person Itsik    schedule 06.10.2009    source источник
comment
stackoverflow.com/questions/1351138/   -  person    schedule 10.07.2013
comment
stackoverflow.com/questions/1351138/   -  person    schedule 10.07.2013


Ответы (2)


На самом деле это не проблема, потому что после привязки вы можете изменить список только с помощью метода Form.Invoke (унаследованного от Control.Invoke). Если вы попытаетесь изменить список из другого потока, среда выполнения .NET будет лаять на ваше исключение, говоря что-то вроде «не может изменить этот список из текущего потока».

Здесь есть код, который вы можете получить.

С уважением, = Алан

person Alan    schedule 28.10.2009

Я думал, что BindingList не поддерживает уведомление об изменении. В этом сценарии я не думаю, что это потокобезопасно.

Решением может быть использование настраиваемой коллекции, реализующей IBindingList, и изменение средства доступа к списку для получения блокировки перед возвратом любого элемента.

У меня есть собственная реализация IBindingList с уведомлением об изменении, поэтому, если хотите, я могу поделиться ею (я, наверное, все равно напишу статью о проекте кода, описывающую реализацию ..)

person kubal5003    schedule 24.10.2009