当前位置: 代码迷 >> .NET Framework >> DataTable 集合已修改;枚举操作可能无法执行,该如何解决
  详细解决方案

DataTable 集合已修改;枚举操作可能无法执行,该如何解决

热度:119   发布时间:2016-05-01 23:31:26.0
DataTable 集合已修改;枚举操作可能无法执行
声明了两个个DataTable 开启了两个线程
线程1控制 dt0,不断的刷新给值
线程2控制dt1,从dt0中筛选有效数据,然后给值


现在在线程2中,出现了 集合已修改;枚举操作可能无法执行 
猜测问题出现应该是   数据量超过一定数量后在还未筛选赋值完成的时候线程1更改了dt0;

问:如果对于这个问题不处理会有什么其他的相关问题出现?
------解决思路----------------------
dt0在线程1修改的时候线程2正在从dt0中获取数据引起的;做对dt0做个锁,某一刻只能有一个线程操作,只有一个线程用完解锁后另外一个线程才能操作。
------解决思路----------------------
那就这样,在线程2访问dt0时,先创建一个新的dataset 把dt0的数据merge到新的dataset中,线程2操作新dataset。
------解决思路----------------------
DataTable 在遍历的时候遭到修改就会出现问题的

类似于
foreach(var item in items)
{
     item = "修改值";
}
绝对出错
------解决思路----------------------
如果你在遍历中有耗时的操作,同时你不在乎这个遍历的过程中集合是否发生变化,你可以先复制一份快照:

private object lockobject = new object(); //写在类定义中。

DataRow[] snapshot;
lock (lockobject)
{
    snapshot = dt.Rows.Cast<DataRow>().ToArray();
}
foreach (DataRow dr in snapshot)
{
    ...
}
  相关解决方案