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

时间:2010-02-15 18:28:00

标签: c# multithreading dataset

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

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

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

编辑:我还需要将数据集绑定到ui网格,这会使问题复杂化。

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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

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

另一种方法是让主数据集处理不可变类型。然后,您可以在单个线程中处理副本,并且仅在替换主数据集中的值时提供同步。这样可以避免锁定单个每个副本的副本。

答案 2 :(得分:1)

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

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