Создание наборов данных, ориентированных на многопотоковое исполнение в C#

Каков лучший шаблон для того, чтобы сделать наборы данных ориентированными на многопотоковое исполнение на записи?

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

Кто-то может рекомендовать / указывают на меня в направлении хорошего решения этого? Это кажется вероятным, чтобы быть проблемой, которая была уже решена где-нибудь.

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

5
задан burnside 15 February 2010 в 18:36
поделиться

3 ответа

«Реализуйте слой-оболочку с замками» - это лучший способ.

Уровень оболочки, скорее всего, будет использовать блокировку, специфичную для того, как ваше приложение использует DataSet.

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

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

3
ответ дан 14 December 2019 в 19:11
поделиться

Это действительно во многом зависит от рассматриваемых данных.

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

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

1
ответ дан 14 December 2019 в 19:11
поделиться

Реализуйте слой-обертку с блокировками. Серьезно. Вы не можете подклассифицировать важные методы, поэтому, пока они доступны, ваша потокобезопасность может быть нарушена.

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

1
ответ дан 14 December 2019 в 19:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: