【发布时间】:2016-09-20 13:41:56
【问题描述】:
我有一个代码块,它处理 StoreProducts 然后在每个循环中在数据库中添加或更新它们。但这很慢。当我转换代码 Parallel.ForEach 块时,相同的产品会同时添加和更新。我不知道如何安全地使用以下功能,我们将不胜感激。
var validProducts = storeProducts.Where(p => p.Price2 > 0
&& !string.IsNullOrEmpty(p.ProductAtt08Desc.Trim())
&& !string.IsNullOrEmpty(p.Barcode.Trim())
).ToList();
var processedProductCodes = new List<string>();
var po = new ParallelOptions()
{
MaxDegreeOfParallelism = 4
};
Parallel.ForEach(validProducts.Where(p => !processedProductCodes.Contains(p.ProductCode)), po,
(product) =>
{
lock (_lockThis)
{
processedProductCodes.Add(product.ProductCode);
}
// Check if Product Exists in Db
// if product is not in Db Add to Db
// if product is in Db Update product in Db
}
这里的事情是,validProducts 列表可能有多个相同的 ProductCode,因此它们是变体,我必须管理即使其中一个正在处理,也不应该再次处理。
因此,在并行 foreach 'validProducts.Where(p => !processedProductCodes.Contains(p.ProductCode)' 中找到的条件无法正常工作。
【问题讨论】:
标签: c# concurrency parallel-processing race-condition parallel.foreach