正在更改ConcurrentBag中的对象

本文关键字:对象 ConcurrentBag | 更新日期: 2023-09-27 18:00:56

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

然而,我看到了执行以下操作的代码:

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

其中Report是袋子所装的对象类型。

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

正在更改ConcurrentBag中的对象

它可以工作,但不是线程安全的。参见文档:

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

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