我正在编写一个 WinForms 应用程序。我正在从我的数据库中提取数据,对该数据集执行一些操作,然后计划将其保存回数据库。我正在使用 LINQ to SQL 对数据库执行查询,因为我只关心数据库中的 1 个表,所以我不想为此实现整个 ORM。
我让它从数据库中提取数据集。但是,数据集相当大。所以目前我正在尝试做的是将数据集分成 4 个相对相等大小的列表(List<object>
)。
然后我有一个单独的后台工作人员来运行每个列表,执行操作并在执行此操作时报告其进度。一旦所有 4 名后台工作人员都完成了他们的部分的处理,我计划将这些部分合并到一个大列表中。
但是当后台工作人员正在处理他们的唯一列表时,我不断收到错误消息。即使对象已转换为 List 对象,它们是否仍保持与 LINQ to SQL 的 DataContext 的联系?任何想法如何解决这一问题?我对多线程的经验很少,所以如果我完全错了,请告诉我。
多谢你们。如果您需要任何代码片段或任何其他信息,请询问。
编辑:哎呀。我完全忘了给出错误信息。在 DataContext Designer.cs 中,它给出了An item with the same key has already been added.
函数的错误SendPropertyChanging
。
private void Setup(){
List<MyObject> quarter1 = _listFromDB.Take(5000).ToList();
bgw1.RunWorkerAsync();
}
private void bgw1_DoWork(object sender, DoWorkEventArgs e){
e.Result = functionToExecute(bgw1, quarter1);
}
private List<MyObject> functionToExecute(BackgroundWorker caller, List<MyObject> myList)
{
int progress = 0;
foreach (MyObject obj in myList)
{
string newString1 = createString();
obj.strText = newString;
//report progress here
caller.ReportProgress(progress++);
}
return myList;
}
所有四个工人都调用了相同的函数,并且根据调用该函数的工人为 myList 提供了不同的列表。