Создание потоков данных безопасных в C # - PullRequest
5 голосов
/ 15 февраля 2010

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 15 февраля 2010

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

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

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

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

1 голос
/ 15 февраля 2010

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

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

1 голос
/ 15 февраля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...