我读到要修改或改变并发包中的对象我必须将其取出,修改它然后再将它放回去。
但是,我见过执行以下操作的代码:
var obj = bag.FirstOrDefault(report => report.id == id);
obj.name = 'Change to something else';
其中Report是行李持有的对象类型。
现在这似乎有效。这是正确的吗?
答案 0 :(得分:4)
它可以工作,但它不是线程安全的。请参阅docs:
ConcurrentBag<T>
的所有公共成员和受保护成员都是线程安全的,可以从多个线程同时使用。但是,通过ConcurrentBag<T>
实现的其中一个接口(包括扩展方法)访问的成员不能保证是线程安全的,可能需要由调用者同步。
换句话说,为了以线程安全的方式修改或改变并发包中的对象,您必须将其取出,修改它然后将其重新放入。