2010-02-15 1 views
5

Каков наилучший образец для создания наборов данных threadafe при записи?Создание наборов данных в безопасном режиме в C#

Лучшее, что я могу найти по googling, это 'реализовать слой обертки с замками', но сначала краснеть кажется довольно грязным.

Может кто-то порекомендовать/указать мне в направлении хорошего решения? Вероятно, это проблема, которая уже была решена где-то.

Редакция:

Редактирование: Мне также необходимо привязать набор данных к сетке ui, что несколько усложняет ситуацию.

+0

извините, наборы данных грязные! –

ответ

3

«Реализация оберточного слоя с замками» - это путь.

В оболочьевом слое, вероятно, будет использоваться блокировка, которая зависит от того, как приложение использует DataSets.

Попытка разработать общее решение для такого сложного класса, как DataSet, вероятно, обречена на провал.

Например, перечисляющие свойства, как правило, не будут потокобезопасными - так что вам нужно будет удерживать блокировку до тех пор, пока любой вызывающий объект перечисляет какие-либо из многих свойств коллекции (DataSet.Tables, DataTable.Rows, .. .).

1

Это действительно зависит от данных, о которых идет речь.

Если вы имеете дело с целыми или ссылочными типами значений, то Interlocked class может быть лучше, чем блокировка. В противном случае успешная синхронизация обычно означает создание внутренней блокировки в классе.

Другая альтернатива, однако, заключается в том, чтобы ваши основные наборы данных работали на неизменяемых типах. Затем вы можете просто работать с копиями в отдельных потоках и выполнять синхронизацию только в момент замены значений в основном наборе данных. Это позволяет избежать блокировок в отдельных копиях в потоке.

1

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

Ну, вы также можете реализовать набор меток расширения потоков и придерживаться их, но это будет работать, только если вам не нужно передавать DataSet в стороннюю библиотеку, которая будет обращаться к ней напрямую.

Смежные вопросы