C# 并行Foreach计数

C# 并行Foreach计数,c#,parallel-processing,C#,Parallel Processing,我的问题很像 但答案不是很清楚,不同的是,我需要计算for-each中哪个对象符合特定标准。如果是,则需要将其添加到列表中 像这样的 List<int> MetCriteria = new List<int>(); Parallel.ForEach(dt.AsEnumerable(), (entry,state) => { if (Convert.ToInt32(entry["Time"]) > 100)//in miliseconds Met

我的问题很像

但答案不是很清楚,不同的是,我需要计算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"]);
}); 
List MetCriteria=new List();
Parallel.ForEach(dt.AsEnumerable(),(条目,状态)=>{
if(Convert.ToInt32(条目[“Time”])>100)//以毫秒为单位
MetCriteria.add(Convert.ToInt32(条目[“EntryID]”);
}); 
因此,很明显,这个列表并没有包含每个正常值所包含的所有值,因为我需要某种方法来保持
MetCriteria
对象的同步,比如线程锁之类的,但我不确定如何做到这一点


请提供任何帮助

您可以像这样使用线程安全集合

var MetCriteria=new ConcurrentBag();
Parallel.ForEach(dt.AsEnumerable(),(条目,状态)=>{
if(Convert.ToInt32(条目[“Time”])>100)//以毫秒为单位
MetCriteria.add(Convert.ToInt32(条目[“EntryID]”);
}); 

您可以像这样使用线程安全集合

var MetCriteria=new ConcurrentBag();
Parallel.ForEach(dt.AsEnumerable(),(条目,状态)=>{
if(Convert.ToInt32(条目[“Time”])>100)//以毫秒为单位
MetCriteria.add(Convert.ToInt32(条目[“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"]));
        }

    }
});
List MetCriteria=new List();
Parallel.ForEach(dt.AsEnumerable(),(条目,状态)=>
{
if(Convert.ToInt32(条目[“Time”])>100)//以毫秒为单位
{
锁(标准)
{
MetCriteria.Add(Convert.ToInt32(条目[“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"]));
        }

    }
});
List MetCriteria=new List();
Parallel.ForEach(dt.AsEnumerable(),(条目,状态)=>
{
if(Convert.ToInt32(条目[“Time”])>100)//以毫秒为单位
{
锁(标准)
{
MetCriteria.Add(Convert.ToInt32(条目[“EntryID]”));
}
}
});

哪一个对资源更友好。这个答案或Dovydas Sopa'sif如果我使用你的答案,我有一个if语句,比如
if(MetCriteria.count>1000)
它不应该正确地影响它(它只是读取数据,没有改变)?接受Dovydas Sopa的回答,这是应该做的。锁定只是防止来自不同线程的同时访问,并使其线程安全。从技术上讲,对象被锁定,另一个访问线程必须等待,直到上一个操作完成。我理解,感谢您的解释,fubo Uppoted:)哪一个对资源更友好。这个答案或Dovydas Sopa’如果我使用你的答案,我有一个if语句,比如
if(MetCriteria.count>1000)
它不应该正确地影响它(它只是读取数据,没有改变)?接受Dovydas Sopa的回答,这是应该做的。锁定只是防止来自不同线程的同时访问,并使其线程安全。从技术上讲,对象被锁定,另一个访问线程必须等待,直到上一个操作完成。我理解,感谢您的解释,fubo Uppoted:)
if
语句真的是你想要做的吗?如果是,为什么你要使用并行处理?我必须根据数量做不同的事情,所以如果它超过100,它符合标准,如果它没有,那么其他变量需要被检查并添加到一个单独的列表中。然后我必须对每个条目调用web服务根据输入时间,您是否只是比较
Convert.ToInt32(输入[“time”])之类的值>100
并将项目添加到列表中,然后调用web服务?或者您在
if
中调用web服务?
if
语句确实是您想要做的吗?如果是,为什么要使用并行处理?我必须根据数量做不同的事情,因此如果超过100,它就符合标准如果没有,则需要检查其他变量,并将其添加到单独的列表中。然后,我必须根据条目时间对每个条目调用web服务,这些条目可能需要一些时间。您是否只是比较值,如
Convert.ToInt32(条目[“time”])>100
并将项目添加到列表中,然后调用web服务?或者如果,您是否在
中调用web服务?