代码:
DataTable dt_list = new DataTable();
dt_list = dt;//dt的原始数据假设为10条
Parallel.ForEach<DataRow>(dt_list.AsEnumerable(), (row) =>
{
Helper_Http.init_sourcelist(dt, row);//这里传入dt,在对应的方法中会增加dt的长度
Thread.Sleep(100);
});
//当函数执行后,很快就会报错,错误内容为:dt_list的长度发生变化
问题:
dt_list在任务前就赋值,防止因为长度发生变化而导致进入死循环,但是,还是出现了想象中的问题,这个该怎么解决呢?
使用并行的集合最好用 线程安全的集合,因为有可能涉及到对集合做Add,Remove。就会出现 长度发生变化的异常
哥们,能不能给个示例?
@有机物: 方便贴出 init_sourcelist 的代码,如果数据量不大,不建议用 并行,调试起来非常麻烦。
你的代码有点不懂 dt 跟 dt_list 应该同一个对象,不明白你的需求要做什么
@geass..:
private void test()
{
DataTable dt = new DataTable();
dt.Columns.Add("name", Type.GetType("System.String"));
dt.Columns.Add("iden", Type.GetType("System.String"));
dt.Columns.Add("ishanlder", Type.GetType("System.Int32"));//是否处理1:处理,0:不处理
//添加数据代码,初始化10条数据,这里就不写了
DataTable dt_list = new DataTable();
dt_list = dt;//这里实例化对象赋值就是为了防止dt_list长度发生变化
Parallel.ForEach<DataRow>(dt_list.AsEnumerable(), (row) =>//任务一开始,dt_list长度就发生了变化
{
Helper_Http.init_sourcelist(dt, row);//这里传入dt,在对应的方法中会增加dt的长度
Thread.Sleep(100);
});
}
private void init_sourcelist(DataTable dt,DataRow row)
{
//这里的dt传递过来有10条数据
//dt这里增加数据
}
可以用for循环那种简单的写法,而不是foreach这种的;
还有注意for循环如果dt队列发生变化的话,要考虑遍历序列方向。
你的意思是并行用FOR处理,不用FOREACH吗?
foreach (DataRow item in dt_list.Select("ishanlder=1"))
这样加个字段标识没有问题。