Parallel.foreach 不处理所有项目
Parallel.foreach doesnt process all items
我这里有问题。我正在尝试使用 Parallel.foreach 将我的数据表转换为列表对象。
像这样 。
public List<ProductList> GetProductList(DataTable table)
{
List<ProductList> list = new List<ProductList>();
Parallel.ForEach(table.AsEnumerable(), item =>
{
string sku = item["product_sku"].ToString();
//int skus = Convert.ToInt16(item["product_sku"]);
string price = item["product_price"].ToString();
string tweakerID = item["ID"].ToString();
string finalPrice = item["FinalPrice"].ToString();
list.Add(new ProductList() { SKU = sku, Price = price, ID = id, FinalPrice = finalPrice });
});
list.RemoveAll(item => item == null);
return list;
}
我有超过 65000 个产品行。
在此之后。列表中仅添加了大约 63000 种产品。
但结果不是固定数字。例如,最后三次我 运行 这个代码我得到了 63202 、 64025 、 62920 。每次都是一个新号码。
我也不例外。
那是因为 List<T>
不是并发安全的。试试看: ConcurrentBag<T>
代替。
ConcurentBag
存在于 System.Collections.Concurrent
命名空间中,其中包含更多的线程安全集合。
所有项目都已处理,但并非所有项目都已添加到列表中。原因是,当两个线程试图在完全相同的时间添加不同的项目时,list 无法处理它,只保存其中一个。
我这里有问题。我正在尝试使用 Parallel.foreach 将我的数据表转换为列表对象。 像这样 。
public List<ProductList> GetProductList(DataTable table)
{
List<ProductList> list = new List<ProductList>();
Parallel.ForEach(table.AsEnumerable(), item =>
{
string sku = item["product_sku"].ToString();
//int skus = Convert.ToInt16(item["product_sku"]);
string price = item["product_price"].ToString();
string tweakerID = item["ID"].ToString();
string finalPrice = item["FinalPrice"].ToString();
list.Add(new ProductList() { SKU = sku, Price = price, ID = id, FinalPrice = finalPrice });
});
list.RemoveAll(item => item == null);
return list;
}
我有超过 65000 个产品行。 在此之后。列表中仅添加了大约 63000 种产品。 但结果不是固定数字。例如,最后三次我 运行 这个代码我得到了 63202 、 64025 、 62920 。每次都是一个新号码。
我也不例外。
那是因为 List<T>
不是并发安全的。试试看: ConcurrentBag<T>
代替。
ConcurentBag
存在于 System.Collections.Concurrent
命名空间中,其中包含更多的线程安全集合。
所有项目都已处理,但并非所有项目都已添加到列表中。原因是,当两个线程试图在完全相同的时间添加不同的项目时,list 无法处理它,只保存其中一个。