繁体   English   中英

从 List 对象中添加和删除项目是否安全?

[英]Is it safe to add and remove items from a List object?

假设我们有多个线程和一个负责保存实时数据的公共List 我们有一些线程负责将数据添加到列表对象。 另一个线程负责从列表对象中获取数据,然后从顶部删除项目。

问题:从List开头删除并同时在单独的线程中将数据添加到列表的末尾是否安全? List对象是如何实现的?

文档

这种类型的公共静态成员是线程安全的。 不保证任何实例成员都是线程安全的。

对 List 执行多次读取操作是安全的,但如果在读取时修改集合,则可能会出现问题。

因此,如果您的集合可以被某些线程修改 - 您需要在写入读取操作上锁定它。

文档还为您提供了另一种解决方案:

有关具有内置同步的集合,请参阅System.Collections.Concurrent命名空间中的类。

例如,像ConcurrentQueue 使用.Enqueue(obj)将其插入到队列的末尾,并使用TryDequeue(out obj)从队列的顶部获取它。

List 不是线程安全的。

您正在解决的问题看起来像是生产者-消费者问题,因此您需要的是一个实现IProducerConsumerCollection<T>的集合:

如果您还需要有界缓冲区(始终只允许集合中有一定数量的项目),您可以使用BlockingCollection<T> ,将上述任何一个作为内部集合。

添加项目到列表<object><div id="text_translate"><p>我是 OOPS 的新手。 我想将项目添加到对象列表</p><pre>Class ABC { int a; int b; int c;} List<ABC> listabc = new List<ABC>();</pre><p> 我无法将 object 的所有三个属性添加在一起,因为它们是在不同时间获取的,但我希望它们成为同一个 object 的一部分,例如:我有不同的调用将其添加到列表中</p><pre>listabc.Add(new ABC {a = 10}); listabc.Add(new ABC {b = 20}); listabc.Add(new ABC {c = 30}); listabc.Add(new ABC {a = 40}); listabc.Add(new ABC {b = 50}); listabc.Add(new ABC {c = 60});</pre><p> 我希望这是 ({10,20,30},{40,50,60}) 而不是这将添加 ({10,0,0},{0,20,0},{0,0,30} ,{40,0,0},{0,50,0},{0,0,60}) 我应该如何将它添加到列表中?</p></div></object>

[英]Add items to List<object>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM