Parallel Foreach counting
本文关键字:counting Foreach Parallel | 更新日期: 2023-09-27 18:02:28
我的问题与Parallel Foreach竞态条件非常相似
但是它没有得到很清楚的回答,它的不同之处在于我需要计算for-each中的哪个对象符合特定的标准。如果有,则需要将其添加到列表中。
所以像这样的
List<int> MetCriteria = new List<int>();
Parallel.ForEach(dt.AsEnumerable(), (entry,state) => {
if (Convert.ToInt32(entry["Time"]) > 100)//in miliseconds
MetCriteria.add(Convert.ToInt32(entry["EntryID"]);
});
所以很明显,这个列表不包含所有的正常值,因为我需要一些方法来保持MetCriteria
对象同步,像线程锁或其他东西,但我不确定如何做到这一点
请帮忙
你可以使用像ConcurrentBag这样的线程安全集合。
var MetCriteria = new ConcurrentBag<int>();
Parallel.ForEach(dt.AsEnumerable(), (entry,state) => {
if (Convert.ToInt32(entry["Time"]) > 100)//in miliseconds
MetCriteria.add(Convert.ToInt32(entry["EntryID"]);
});
当然你可以锁定你的列表,使其威胁安全。但是我会使用像Dovydas Sopa建议的线程安全集合。
List<int> MetCriteria = new List<int>();
Parallel.ForEach(dt.AsEnumerable(), (entry, state) =>
{
if (Convert.ToInt32(entry["Time"]) > 100)//in miliseconds
{
lock (MetCriteria)
{
MetCriteria.Add(Convert.ToInt32(entry["EntryID"]));
}
}
});