【发布时间】:2012-09-21 12:59:50
【问题描述】:
我正在使用 .net 3.5 数据表并从多个线程向数据表添加行。当不使用锁时,我得到 datatablr 行数和最大索引之间的不匹配。当试图序列化表时,我得到一个异常there is no rows at poitions X。当然我可以锁定数据表,但我想知道是什么原因。我希望row.count() 方法基于行最大索引+1 返回,而不是具有非独立计数器。另外,我在哪里可以找到rows.Add (params) 方法的内部实现?即使在某些情况下添加在同一行上,每次添加似乎计数器都会增加。
编辑:感谢 cmets。我确实知道它不是线程安全的写入并且已经通过在同步根对象上使用锁定来解决它。我想看看 add 方法内部发生了什么,看看计数在哪里搞砸了。
【问题讨论】:
-
来自 DataTable docs 的引用:这种类型对于多线程读取操作是安全的。您必须同步任何写入操作。 (msdn.microsoft.com/en-us/library/…)
-
发布您的示例代码,以便我们尝试复制问题。
-
您可以轻松重现它:DataTable dt = new DataTable(); for (int i = 0; i dt.Rows.Add(new object[] {})).Start(); } 现在检查计数值和行列表。他们不相等。
-
@AntonioBakula,如果我能对该评论 +1 一百万次,我愿意。编程中一个非常常见的错误是假设多线程只是完全封装而您不必担心。这几乎和人们想的一样大的错误,因为 .NET 中有“垃圾收集”,他们不必关心如何设置和限定对象引用。