我使用了在多个线程之间共享的静态全局数据集。
我遇到以下异常:
数据表内部索引是 腐败:'5'。
在线程中,我从数据表&读取值。更新(使用合并)数据表中的值,两个操作都在线程中完成。
答案 0 :(得分:2)
您正在对来自不同线程的数据集执行操作。
数据集不是线程安全的,您应该创建一个wrapper class
来保护数据集,使其不会超过1次操作。这称为互斥:
更好的解决方案是根本不使用全局状态。这将解决您的问题,无需任何额外的工作,使您的代码更可靠。
答案 1 :(得分:1)
如果您正在使用带有数据集的线程,则会发生该错误。
就我而言,我试图在一个在线程中运行的方法中为数据集创建一个新行。
一种方法是使用 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 方法中,我在线程中进行了大量计算。
希望这有帮助。
答案 2 :(得分:0)
好吧,因为您在多个线程中使用dataTable,所以如果您从不同的线程操作对象,则很可能会出现损坏。
可帮助您解决问题的一些提示:
if (column.Expression != "some expression") column.Expression = "some expression";
答案 3 :(得分:0)
这就是我修复内部索引是如何损坏的问题:
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;
答案 4 :(得分:0)
可能是你在同一时间在多个进程中使用相同的数据表..我刚刚使用SYNCLOCK解决了这个问题..
试试这个..
SyncLock your datatable
'''' -------your datatable process
End SyncLock
如果这对你有帮助,请告诉我..
快乐编码..
答案 5 :(得分:0)
为了防止在我使用的多个线程中执行:
Application.Lock();
--- do your stuff in the datatable
Application.UnLock();
答案 6 :(得分:0)
DataTable.BeginLoadData();
// Do MultiThreaded Inserts
DataTable.EndLoadData();
DataTable.AcceptChanges();
这将解决您的问题