【问题标题】:ConcurrentBag and foreachConcurrentBag 和 foreach
【发布时间】:2014-09-09 04:49:06
【问题描述】:

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

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

所以我的问题是,在不破坏 ConcurrentBag 的线程安全的情况下,这里的普通 foreach 是否可行,还是我必须使用 Parallel.ForEach?

【问题讨论】:

    标签: c# multithreading foreach parallel-processing parallel.foreach


    【解决方案1】:

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

    From the fine manual:

    备注

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

    【讨论】:

    • foreach 是否自动使用 GetEnumeration 方法?还是我必须像“foreach (MyObject current in MyConcurrentBag.GetEnumerator())”而不是“foreach (MyObject current in MyConcurrentBag)”那样做?
    • From the fine manual 计算为实现 IEnumerable 的类型或声明 GetEnumerator 方法的类型。 从概念上讲,foreach 调用 GetEnumerator,尽管编译器和 JIT 优化器可能会拉一路上的一些花招。
    • 好的,所以它应该叫它 tnx。 (不知何故,我总是设法找不到我在手册中搜索的东西^^')
    猜你喜欢
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2020-02-25
    相关资源
    最近更新 更多