首页 > 解决方案 > 使用多个 Datareader 连接进行批处理

问题描述

我有一个超过 100000 条记录的表。我想读取数据,处理它们,然后如果处理成功则删除该行,如果失败则使用错误代码更新该行。

我的方法是一次获取 1000 条记录,将其加载到数据表中,然后将其传递给在 5 个并行线程中运行进程的函数。处理完前 1000 条记录后,打开一个新的 DataReader 并处理接下来的 1000 条……依此类推……

我的方法看起来对吗?我遇到的问题是代码运行良好,但 1000 条记录没有完全处理。处理了大约 300 条记录,其余的仍然存在。我在这里做错了什么?

 using (SqlDataReader rdr = cmd.ExecuteReader) {
    if (rdr.HasRows) {
        Datatable dt = new Datatable();
        dt.Load(rdr);
        //process data
        results = Process(dt);
    }
}

public List<string> Process(Datatable dt) {
    var options = new ParallelOptions() {
    MaxDegreeOfParallelism = 5
    }
    List<string> results = new List<string>();
    
    Parallel.ForEach(dt.Rows.Cast<DataRow>(), options, (trans) => {
        //process and then delete/update row
        ....
        results.Add(transResult);
    });
    return results
}

标签: c#.netmultithreadingdatatabledatareader

解决方案


线程共享相同的资源,因此会导致 dbContext 出现问题。所以最好将 Parallel.ForEach 锁定为

    Parallel.ForEach(dt.Rows.Cast<DataRow>(), options, (trans) => {
        var obj=new object();
    lock(obj)
            {
            //...your processing
            }
        });

推荐阅读