在这种情况下,员工和/或疾病实例是线程安全的吗?每个线程都有自己的对象副本吗?起初我以为每个线程都有自己的副本,但现在我不确定。
Parallel.ForEach(line01s, _options, o =>
{
var employee = new Employee();
// set values on employee...Safe?
var illness = new Illness();
// set values on illness...Safe?
employee.AddIllness(illness); // Illness is a property on Employee
}
Disease对象是否可能设置在错误的Employee对象上?我需要在员工周围添加锁吗?AddDisease(疾病)?我越是使用这种TPL的东西,就越发现我不理解
您的示例仅适用于在lambda表达式范围内创建的对象,因此您无需担心。如果您正在修改lambda块之外的对象的状态,那么您需要担心锁定等问题。
如果在employees集合上迭代Parallel.ForEach,或者在lambda中创建新的employee,那么就不用担心了。每个lambda调用都完全独立于其他调用(如果闭包中没有外部变量)。
如果员工集合有重复项或处理更复杂,则必须使用一些同步代码。