将常规foreach转换为parallel.foreach或parallel.for循环

时间:2017-02-01 16:32:31

标签: c# multithreading performance foreach parallel-processing

我试图将这段代码转换为并行循环,如:

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 ...

如何将这段代码转换为同时执行这些操作?

0 个答案:

没有答案