C# 使用Parallel.ForEach<;T>;将布尔外部设置为Parallel.ForEach的步骤

C# 使用Parallel.ForEach<;T>;将布尔外部设置为Parallel.ForEach的步骤,c#,.net,multithreading,parallel-processing,task-parallel-library,C#,.net,Multithreading,Parallel Processing,Task Parallel Library,我想使用列表上的Parallel.ForEach的强大功能进行验证例程。迭代列表以确保属性不小于1。如果验证发现验证方法调用中返回的错误,将创建一个设置为false的bool。有人告诉我,这段代码有问题,因为bool是一个原语,不是线程安全的。有没有一种方法可以在具有大量内核和RAM的服务器上利用Parallel.ForEach的强大功能,并确保它在线程安全方面正常工作 public static bool IsValid(List<Airport> entities) {

我想使用
列表
上的
Parallel.ForEach
的强大功能进行验证例程。迭代列表以确保属性不小于1。如果验证发现验证方法调用中返回的错误,将创建一个设置为false的bool。有人告诉我,这段代码有问题,因为bool是一个原语,不是线程安全的。有没有一种方法可以在具有大量内核和RAM的服务器上利用
Parallel.ForEach
的强大功能,并确保它在线程安全方面正常工作

public static bool IsValid(List<Airport> entities)
{
    bool isValid = true;

    Parallel.ForEach<Airport>(entities, entity =>
    {
        // userId can't be less than 1
        if (entity.userId < 1)
        {
            SiAuto.Main.LogMessage("Airport {0}: invalid userId {1}", entity.airportId, entity.userId);
            isValid = false;
            System.Diagnostics.Debugger.Break();
        }
    });

    return isValid;
}
公共静态bool有效(列出实体)
{
bool isValid=true;
Parallel.ForEach(实体,实体=>
{
//用户ID不能小于1
if(entity.userId<1)
{
SiAuto.Main.LogMessage(“Airport{0}:无效的userId{1}”,entity.airportId,entity.userId);
isValid=false;
System.Diagnostics.Debugger.Break();
}
});
返回有效;
}

如果列表足够大,我会使用PLINQ方法,使用
可枚举。任何
可枚举。所有

return !entities.AsParallel().Any(x => x.UserId < 1);
返回!entities.aspallel().Any(x=>x.UserId<1);

返回entities.aspallel().All(x=>!(x.UserId<1));
通常在使用管道式执行时,我发现PLINQ比
并行
类更合适,因为它消除了在并行循环中更新共享资源的需要


注意,您应该对代码进行基准测试,以确保并行性是值得的。在许多情况下,如果列表不够大,这可能会降低性能等级。

如果列表足够大,我会使用PLINQ方法,使用
可枚举。任何
可枚举。所有

return !entities.AsParallel().Any(x => x.UserId < 1);
返回!entities.aspallel().Any(x=>x.UserId<1);

返回entities.aspallel().All(x=>!(x.UserId<1));
通常在使用管道式执行时,我发现PLINQ比
并行
类更合适,因为它消除了在并行循环中更新共享资源的需要


注意,您应该对代码进行基准测试,以确保并行性是值得的。在许多情况下,如果列表不够大,可能会降低性能等级。

您可以使用PLINQ:

public static bool IsValid(List<Airport> entities)
{
    return !entities.AsParallel().Any(entity => entity.UserId < 1);
}

您可以使用PLINQ实现这一点:

public static bool IsValid(List<Airport> entities)
{
    return !entities.AsParallel().Any(entity => entity.UserId < 1);
}

由于您只将其设置为false,我不认为这是线程安全的。但您不希望在第一个错误后中断循环吗?列表有多大?我不理解同步问题。。这里有什么不安全的。。某些线程可能会将其设置为false。。那又怎样?既然你只把它设为false,我不知道这怎么会是线程安全的。但是你不愿意在第一个错误后中断循环吗?列表有多大?我不理解同步问题。。这里螺纹不安全的地方。。某些线程可能会将其设置为false。。那又怎么样?