在C#中使数据集线程安全

在写入时使数据集线程安全的最佳模式是什么?

我通过谷歌搜索找到的最好的是“实现一个带锁的包装层”,但乍一看这看起来相当混乱。

有人可以推荐/指出我的方向来解决这个问题吗? 这似乎是一个已经在某处解决过的问题。

编辑:我还需要将数据集绑定到ui网格,这在某种程度上使问题复杂化。

“实现带锁的包装层”是可行的方法。

包装器层可能会使用特定于应用程序使用DataSet的方式的锁定。

尝试为像DataSet这样复杂的类设计通用解决方案可能注定要失败。

例如,枚举属性通常不是线程安全的 – 因此只要任何调用者枚举任何许多集合属性(DataSet.Tables,DataTable.Rows,…),就需要保持锁定。

这在很大程度上取决于相关数据。

如果您正在处理整数或引用类型值,则Interlocked类可能优于获取锁定。 否则,成功同步通常意味着在类中创建内部锁定。

然而,另一种选择是使主数据集在不可变类型上工作。 然后,您可以在单个线程中处理副本,并且仅在替换主数据集中的值时提供同步。 这避免了每个线程的单个副本中的锁定。

使用锁实现包装器层。 认真。 您不能将重要方法子类化,因此只要它们可用,您的线程安全性就会被破坏。

好吧,你也可以实现一组线程安全的扩展方法并坚持这些方法,但只有当你不必将DataSet传递给将直接访问它的第三方库时,它才会起作用。