在ConcurrentBag中更改对象?

时间:2015-07-02 22:48:49

标签: c# thread-safety

我读到要修改或改变并发包中的对象我必须将其取出,修改它然后再将它放回去。

但是,我见过执行以下操作的代码:

var obj = bag.FirstOrDefault(report => report.id == id);
obj.name = 'Change to something else';

其中Report是行李持有的对象类型。

现在这似乎有效。这是正确的吗?

1 个答案:

答案 0 :(得分:4)

它可以工作,但它不是线程安全的。请参阅docs

  

ConcurrentBag<T>的所有公共成员和受保护成员都是线程安全的,可以从多个线程同时使用。但是,通过ConcurrentBag<T>实现的其中一个接口(包括扩展方法)访问的成员不能保证是线程安全的,可能需要由调用者同步。

换句话说,为了以线程安全的方式修改或改变并发包中的对象,您必须将其取出,修改它然后将其重新放入。