DataTable内部索引已损坏:’5’。用于线程

我使用了许multithreading之间共享的静态全局数据集。

我得到以下exception:

数据表内部索引已损坏:’5’。

在线程中,我从数据表中读取值并更新(使用合并)数据表中的值,这两个操作都是在线程中完成的。

您正在对来自不同线程的数据集执行操作。

数据集不是线程安全的,您应该创建一个wrapper class ,以保护数据集在当时不超过1个操作。 这称为互斥:

链接到microsoft msdn

更好的解决方案是根本不使用全局状态。 这将解决您的问题,无需任何额外的工作,使您的代码更可靠。

如果您使用带有数据集的线程,则会发生该错误。

在我的例子中,我试图在一个在线程中运行的方法中为数据集创建一个新行。

一种方法是使用SyncLock围绕创建行的方法或另一种方式(可能甚至更好)是在线程之外创建行。

基本上我的代码看起来像这样:

  Dim elements As New List(Of element) Dim dataRows As New List(Of MyDataSet.Row) For i As Integer = 0 To elements.Count - 1 dataRows.Add(Me.Ds.Elements.NewElementsRow) Next Parallel.For(0, elements.Count, Sub(i As Integer) Me.CreateElementRow(elements(i), dataRows(i)) End Sub) 

CreateElementRow方法中,我在线程中进行了大量的计算。

希望这可以帮助。

好吧,既然你在多个线程中使用了dataTable,那么很可能会出现损坏 – 如果你是从不同的线程操作对象的话。

一些指导可以帮助您解决问题:

  • 避免使用默认视图,并尽可能修改默认视图。 顺便说一句,.Net 2.0在创建视图时有许多读/写锁,因此它们不是2.0之前的问题。
  • 尽可能调用AcceptChanges()。
  • 请注意。选择(表达式),因为此代码中没有读取器/写入器锁定 – 并且它是唯一的位置(至少根据usenet上的某个人所使用它,所以要带它一粒盐 – 但是,这与您的问题非常相似 – 因此使用互斥锁可能有所帮助)
  • 将AllowDBNull设置为有问题的列(可疑值,但在usenet上报告 – 我只在有意义的地方使用它)
  • 确保您没有将null(C#)/ Nothing(VB)设置为DataRow字段。 使用DBNull.Value而不是null。 在您的情况下,您可能希望检查该字段是否为空,表达式语法确实支持IsNull(val,alt_val)运算符。
  • 这可能对我帮助最大(听起来很荒谬):如果值没有改变,请不要分配它。 例如,如果要为某些列指定值,请执行以下操作:
 if (column.Expression != "some expression") column.Expression = "some expression"; 

答案来源: StackOverflow – DataTable内部索引已损坏

可能是你在同一时间在多个进程中使用相同的数据表..我刚刚使用SYNCLOCK解决了这个问题..

试试这个..

 SyncLock your datatable '''' -------your datatable process End SyncLock 

如果这对您有帮助,请告诉我..

快乐的编码..

这是我修复内部索引是如何被破坏的问题:

 System.Data.DataTable dtNew = new DataTable(); for (int iCol = 0; iCol < dtOriginalData.Columns.Count; iCol++) { dtNew.Columns.Add(dtOriginalData.Columns[iCol].ColumnName, dtOriginalData.Columns[iCol].DataType); } for (int iCopyIndex = 0; iCopyIndex < item.Data.Rows.Count; iCopyIndex++) { dtNew.Rows.Add(dtOriginalData.Rows[iCopyIndex].ItemArray); //dtNew.ImportRow(dtOriginalData.Rows[iCopyIndex]); } dtOriginalData = dtNew; 

为了防止在我使用的多个线程中执行:

 Application.Lock(); --- do your stuff in the datatable Application.UnLock(); 
 DataTable.BeginLoadData(); // Do MultiThreaded Inserts DataTable.EndLoadData(); DataTable.AcceptChanges(); 

这将解决您的问题