abx*_*x78 12 .net parallel-processing parallel-collections
我使用Parallel.Foreach来填充外部ConcurrentBag.我也尝试使用一个常见的List,一切正常.
我很幸运或者我错过了ConcurrentBag的特殊范围?
Jud*_*ngo 18
你很幸运; Parallel.ForEach填充List不是线程安全的,最终会遇到问题.
根据MSDN,List<T>不是线程安全的:
任何实例成员都不保证是线程安全的.
List <T>可以同时支持多个读取器,只要不修改集合即可.枚举通过集合本质上不是线程安全的过程.在枚举与一个或多个写访问争用的极少数情况下,确保线程安全的唯一方法是在整个枚举期间锁定集合.要允许多个线程访问集合以进行读写,您必须实现自己的同步.
ConcurrentBag是您应该使用的,这对多个读者和编写者来说是线程安全的.
如果您正在使用Parallel.ForEach填充a List<T>并且一切正常,那么您只是运气好.该ForEach方法可以并将在多个线程上运行您的代码,因此外部的任何通信ForEach必须与可以处理并发更新的对象一起. List<T>不能不ConcurrentBag<T>能.
| 归档时间: |
|
| 查看次数: |
6960 次 |
| 最近记录: |