我见过ConcurrentBag和Parallel.ForEach用于另一个问题。现在我想知道如果我使用常规foreach而不是Parallel.ForEach从ConcurrentBag读取数据,它是否仍然是线程安全的。
因此,即使其他线程正在向ConcurrentBag添加数据并从中删除数据,我想在特定的线程中查看包中的所有项目(它甚至可以是该包的快照,因为它不必是100 %是最新的)并使用找到的其他数据。
所以我的问题是这是一个正常的foreach,可以在不破坏ConcurrentBag的线程安全的情况下使用或者我是否必须使用arallel.ForEach?
答案 0 :(得分:3)
对于您的方案,您是否使用foreach
或Parallel.ForEach
评估某个集合并没有任何区别。很多事情都是如此。 Parallel.ForEach
并没有神奇地将枚举数放入一些特殊的线程安全模式。
说明
枚举表示行李内容的即时快照。调用GetEnumerator后,它不会反映对集合的任何更新。该枚举器可以安全地与读取和写入包同时使用。