今天写程序遇见一个错误,错误是 “DataTable 内部索引已损坏:“13””。
程序是在一个线程里不停的对绑定在gridcontrol上的datatable进行添加行操作,运行一段时间就出错。
在网上搜了下,csdn的孟子大哥说是
由于性能原因,DataTable 没有设计成线程安全的,解决这个问题,可以在修改数据的时候采用lock语句
这里的修改包括:
1,添加,删除,修改DataTable的行
2,使用DataTable 的Select方法选择行,这会通过创建索引从而修改DataTable
3,在DataTable上创建DataViews ,也会导致重建索引
4,修改Sort属性也会导致DataTable的修改。
所以我就用lock语句,但是发现lock语句没有什么用,lock了一样的还是要出这个错误。lock修改后如下:
lock( m_BindDTable)
{
m_BindDTable.Rows.Add(dr);
}
后面我改成
m_BindDTable.BeginLoadData();
m_BindDTable.Rows.Add(dr);
m_BindDTable.EndLoadData();
m_BindDTable.AcceptChanges();
错误便没有出现异常了。具体详细的原理我说不上,但事实就是错误没有了。
错误原理估计是在添加行时,datatable内部对它进行了排序,操作太快了从而出错。
写这篇博客的时候,我又试了下,把我添加的语句注释了,结果错误又没有出现了,郁闷,不知道怎么回事。只不过不管了,我还是把代码加上去再说,免得后面再次出现。
希望我的方法能帮助出现过这个问题的朋友