C# 并行包和foreach

C# 并行包和foreach,c#,multithreading,foreach,parallel-processing,parallel.foreach,C#,Multithreading,Foreach,Parallel Processing,Parallel.foreach,我看到ConcurrentBag和Parallel.ForEach在另一个问题中使用。现在我想知道如果我使用常规foreach而不是Parallel.foreach从ConcurrentBag读取数据,是否仍然是线程安全的 因此,即使其他线程正在向ConcurrentBag添加数据并从中删除数据,我还是希望在特定的线程中遍历该包中的所有项目(它甚至可以是该包的快照,因为它不必是100%最新的),并将找到的数据用于其他用途 所以我的问题是,在不破坏ConcurrentBag的线程安全的情况下,正常

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

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


所以我的问题是,在不破坏ConcurrentBag的线程安全的情况下,正常的foreach是可行的,还是我必须使用Parallel.foreach?

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

:

评论 枚举表示行李内容的即时快照。它不反映调用GetEnumerator后对集合的任何更新。枚举器可以安全地与从包读取和写入包的操作同时使用


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

:

评论 枚举表示行李内容的即时快照。它不反映调用GetEnumerator后对集合的任何更新。枚举器可以安全地与从包读取和写入包的操作同时使用


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

:

评论 枚举表示行李内容的即时快照。它不反映调用GetEnumerator后对集合的任何更新。枚举器可以安全地与从包读取和写入包的操作同时使用


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

:

评论 枚举表示行李内容的即时快照。它不反映调用GetEnumerator后对集合的任何更新。枚举器可以安全地与从包读取和写入包的操作同时使用


foreach是否自动使用GetEnumeration方法?或者我必须像“foreach(MyConcurrentBag.GetEnumerator()中的MyObject current”)那样执行,而不是“foreach(MyConcurrentBag中的MyObject current”)?计算为实现IEnumerable的类型或声明GetEnumerator方法的类型。从概念上讲,
foreach
调用
GetEnumerator
,尽管编译器和JIT优化程序可能会使用一些技巧。好的,所以它应该称为tnx。(不知何故,我总是设法找不到我在手册中搜索的东西^^')foreach是否自动使用GetEnumeration方法?或者我是否必须像“foreach(MyConcurrentBag.GetEnumerator()中的MyObject current)而不是“foreach(MyConcurrentBag中的MyObject current”)?计算为实现IEnumerable的类型或声明GetEnumerator方法的类型。从概念上讲,
foreach
调用
GetEnumerator
,尽管编译器和JIT优化程序可能会使用一些技巧。好的,所以它应该称为tnx。(不知何故,我总是设法找不到我在手册中搜索的东西^^')foreach是否自动使用GetEnumeration方法?或者我是否必须像“foreach(MyConcurrentBag.GetEnumerator()中的MyObject current)而不是“foreach(MyConcurrentBag中的MyObject current”)?计算为实现IEnumerable的类型或声明GetEnumerator方法的类型。从概念上讲,
foreach
调用
GetEnumerator
,尽管编译器和JIT优化程序可能会使用一些技巧。好的,所以它应该称为tnx。(不知何故,我总是设法找不到我在手册中搜索的东西^^')foreach是否自动使用GetEnumeration方法?或者我是否必须像“foreach(MyConcurrentBag.GetEnumerator()中的MyObject current)而不是“foreach(MyConcurrentBag中的MyObject current”)?计算为实现IEnumerable的类型或声明GetEnumerator方法的类型。从概念上讲,
foreach
调用
GetEnumerator
,尽管编译器和JIT优化程序可能会使用一些技巧。好的,所以它应该称为tnx。(不知何故,我总是设法在手册中找不到我要找的东西^^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^