在这种情况下,Employee和/或Illness实例是否是线程安全的?每个线程都有自己的对象副本吗?最初我认为每个帖子都有自己的副本,但现在我不确定。
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
}
是否可以在错误的Employee对象上设置Illness对象?我是否需要在 employee.AddIllness(疾病); 周围添加锁定?我使用这个TPL的东西越多,我就越发现我不理解
答案 0 :(得分:7)
您的示例仅适用于在lambda表达式范围内创建的对象,因此您无需担心。如果你正在修改lambda块之外的对象的状态,那么你需要担心锁定等。
答案 1 :(得分:2)
如果您在员工集合中迭代Parallel.ForEach,或在lambda中创建新员工,那么没有什么可担心的。每个lambda调用完全独立于其他调用(如果closure中没有外部变量)。
如果员工集合有重复或处理更复杂,那么您将不得不使用一些synchronization code。