我试图将这段代码转换为并行循环,如:
foreach (var item in filteredList)
{
var itm = ctx.SearchedUserItems.FirstOrDefault(x => x.ItemID == item.ItemID);
if (itm == null)
{
ss.Add(new SearchedUserItems() { ItemID = item.ItemID, QuantitySold = item.QuantitySold, SearchedUserID = updatedUser.SearchedUserID });
}
else if (item != null)
{
if (itm.QuantitySold != item.QuantitySold)
{
newFilteredList.Add(item);
itm.QuantitySold = item.QuantitySold;
ctx.SaveChanges();
}
}
}
通过使用Parallel.For或Parallel.Foreach循环来加快速度..
问题是我总是在这行代码中将对象引用设置为实例:
var itm = ctx.SearchedUserItems.FirstOrDefault(x => x.ItemID == item.ItemID);
我在这个for循环之外创建我的模型的ctx对象,如下所示:
var ctx = new myDBModel();
我意识到每次创建新线程时我都需要创建一个新的db模型实例:
using(var ctx = new myDBModel())
{
// do some parallel stuff here...
}
这里的问题是ss集合是一个并发包,而newFilteredList只是一个简单的简单列表......
如果我在这里使用了Parallel.For循环,我会遇到问题,因为列表不是线程安全的......
我正在考虑使用PLINQ,但后来我不知道应该如何优化我的代码,以便在将其转换为多线程代码时可以避免任何可能的错误。 ..
所以ss集合的类型是ConcurrengBag,newFilteredList是普通的常规List ...
如何将这段代码转换为同时执行这些操作?