【问题标题】:.NET - multi-threaded iteration over a single List (Of T) - What do I need to watch out for?.NET - 单个列表(T 的)上的多线程迭代 - 我需要注意什么?
【发布时间】:2009-10-22 06:22:32
【问题描述】:

我正在使用 VB.NET。

我想构建一个大型列表(MyClassOrStructure),在初始填充后变为静态。

我将有多个线程需要遍历此列表以读取数据(不写入、插入或删除)

有什么非常糟糕的事情需要我注意吗?

谢谢。

【问题讨论】:

    标签: .net vb.net multithreading list data-structures


    【解决方案1】:

    如果您只是在阅读,那就没问题了。每个迭代器都将独立于其他迭代器。

    如果您曾经想知道为什么IEnumerable<T> 接口不直接具有MoveNext() 和Current,而是必须创建一个IEnumerator<T> 实例,这就是为什么 - 列表本身不保留“光标”表示迭代器在哪里,它在IEnumerator<T> 中。在线程之间共享IEnumerator<T> 值几乎肯定是个坏主意——但你不太可能意外地这样做。在多个线程上迭代的自然方式是每个线程有一个IEnumerator<T>,这是安全的(只要您不修改列表)。

    【讨论】:

      【解决方案2】:

      如果值是静态的,我看不出任何需要锁定,但如果你很少写入对象,你可以查看 ReaderWriterLock 类

      【讨论】:

        【解决方案3】:

        如果同时涉及读取和写入,您显然需要某种锁定。 最好的方法是使用读写锁。见ReaderWriterLockSlim。

        【讨论】:

        • 但是他没有写任何东西;)所以也没有必要锁定。
        猜你喜欢
        • 1970-01-01
        • 2016-10-06
        • 2012-04-05
        • 1970-01-01
        • 2016-03-20
        • 1970-01-01
        • 2018-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多