首页 新闻 赞助 找找看

winform 并行任务集合长度变化问题

0
悬赏园豆:5 [已解决问题] 解决于 2020-12-23 11:34

代码:
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在任务前就赋值,防止因为长度发生变化而导致进入死循环,但是,还是出现了想象中的问题,这个该怎么解决呢?

有机物的主页 有机物 | 初学一级 | 园豆:19
提问于:2019-09-12 17:23
< >
分享
最佳答案
0

使用并行的集合最好用 线程安全的集合,因为有可能涉及到对集合做Add,Remove。就会出现 长度发生变化的异常

收获园豆:5
geass.. | 小虾三级 |园豆:1821 | 2019-09-12 17:55

哥们,能不能给个示例?

有机物 | 园豆:19 (初学一级) | 2019-09-12 17:56

@有机物: 方便贴出 init_sourcelist 的代码,如果数据量不大,不建议用 并行,调试起来非常麻烦。
你的代码有点不懂 dt 跟 dt_list 应该同一个对象,不明白你的需求要做什么

geass.. | 园豆:1821 (小虾三级) | 2019-09-12 18:00

@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这里增加数据
    }
有机物 | 园豆:19 (初学一级) | 2019-09-12 18:06
其他回答(1)
0

可以用for循环那种简单的写法,而不是foreach这种的;
还有注意for循环如果dt队列发生变化的话,要考虑遍历序列方向。

waiter | 园豆:1000 (小虾三级) | 2019-09-12 17:49

你的意思是并行用FOR处理,不用FOREACH吗?
foreach (DataRow item in dt_list.Select("ishanlder=1"))
这样加个字段标识没有问题。

支持(0) 反对(0) 有机物 | 园豆:19 (初学一级) | 2019-09-12 17:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册