Parallel.ForEach - 具有嵌套实例对象的线程安全性

时间:2014-10-22 16:27:46

标签: c# task-parallel-library

在这种情况下,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的东西越多,我就越发现我不理解

2 个答案:

答案 0 :(得分:7)

您的示例仅适用于在lambda表达式范围内创建的对象,因此您无需担心。如果你正在修改lambda块之外的对象的状态,那么你需要担心锁定等。

答案 1 :(得分:2)

如果您在员工集合中迭代Parallel.ForEach,或在lambda中创建新员工,那么没有什么可担心的。每个lambda调用完全独立于其他调用(如果closure中没有外部变量)。

如果员工集合有重复或处理更复杂,那么您将不得不使用一些synchronization code