ConcurrentBag and foreach

本文关键字:foreach and ConcurrentBag | 更新日期: 2023-09-27 18:13:30

我看过ConcurrentBag和Parallel。ForEach在另一个问题中使用。现在我想知道如果我使用常规的foreach而不是并行,它是否仍然是线程安全的。从ConcurrentBag中读取数据。

因此,即使其他线程正在向ConcurrentBag添加数据和从ConcurrentBag中删除数据,我也希望在一个特定的线程中遍历包中的所有项目(它甚至可以是该包的快照,因为它不必是100%最新的),并将找到的数据用于其他目的。

所以我的问题是,是一个正常的foreach这里可行而不破坏ConcurrentBag的线程安全,或者我必须使用Parallel.ForEach?

ConcurrentBag and foreach

对于您的场景,使用foreach还是Parallel.ForEach评估集合没有区别。很多事情都是如此。Parallel.ForEach不会神奇地将枚举器踢入某种特殊的线程安全模式。

从精细手册:

<标题>评论

枚举表示包中内容的某个时刻的快照。它不反映调用GetEnumerator后对集合的任何更新。该枚举数可以安全地并发地对袋子进行读写操作。