问题描述
我有一张超过 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
}
解决方法
线程共享相同的资源,因此会导致 dbContext 出现问题。所以最好在 Parallel.ForEach as 中做锁
Parallel.ForEach(dt.Rows.Cast<DataRow>(),options,(trans) => {
var obj=new object();
lock(obj)
{
//...your processing
}
});