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对象同步,像线程锁或其他东西,但我不确定如何做到这一点

请帮忙

Parallel Foreach counting

你可以使用像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"]));
        }
    }
});