我有一个奇怪的情况,看:
public List<Car> GetCars(List<Entity> entities)
{
List<Car> cars = new List<Car>();
Parallel.ForEach(entities, entity =>
{
var car = ConvertToCar(entity);
lock(cars)
{
cars.Add(car);
}
});
}
当我在4 cars
之后查看Parallel.ForEach
列表entities
之后,我得到了4辆相同的汽车。如果我在Parallel.ForEach
内放置一个断点,经过4次迭代(4种不同的entities
),我现在得到了4种不同的汽车。所以为什么?我错过了什么?
编辑和解决方案
你知道你什么时候因为在你面前的某些事情而失去了一整天?谢谢@juharr。这段代码是遗留代码,在ConvertToCar方法中,我没有看到:
public Car ConvertToCar(Entity entity)
{
newCar = new Car();
newCar.Id = entity.id;
newCar.Color = entity.color;
[...]
return newCar;
}
查看newCar
,是遗留代码中的新车,新车是全局变量。这就是问题所在。当我改为var newCar = new Car();
时,一切都还可以!