1

我正在使用 .net 3.5 数据表并从多个线程向数据表添加行。当不使用锁时,我得到 datatablr 行数和最大索引之间的不匹配。尝试序列化表时出现异常there is no rows at poitions X。当然我可以锁定数据表,但我想知道是什么原因。我希望该row.count()方法基于行最大索引 +1 返回,而不是具有非独立计数器。另外,我在哪里可以找到rows.Add(params) 方法的内部实现?即使在某些情况下添加在同一行上,每次添加似乎计数器都会增加。

编辑:感谢您的评论。我确实知道它不是线程安全的写入并且已经通过在同步根对象上使用锁定来解决它。我想看看 add 方法内部发生了什么,看看计数在哪里搞砸了。

4

1 回答 1

4

原因很简单:DataTable不是线程安全的。它没有声称是线程安全的(针对竞争性写入),也不需要是线程安全的。大多数代码都不是线程安全的,除非有明确说明“我在以下情况下是线程安全的”,否则您应该假设它不是。

最常见的是,在这种情况下,它意味着以下之一:

  • 索引更新正在丢失,即两者同时进行count++,仅增加 1
  • 当数组被复制、增长、缩小或重新排列时,操作会导致疯狂的数据

修复很简单:如果任何线程正在更改表,它必须具有独占访问权限。所以同步。lock是最简单的选择,但ReaderWriterLockSlim存在更多奇特的选择。

然后下一步是决定:我们真的想要使用DataTable吗?

于 2012-09-21T13:11:30.960 回答