【发布时间】:2009-10-22 06:22:32
【问题描述】:
我正在使用 VB.NET。
我想构建一个大型列表(MyClassOrStructure),在初始填充后变为静态。
我将有多个线程需要遍历此列表以读取数据(不写入、插入或删除)
有什么非常糟糕的事情需要我注意吗?
谢谢。
【问题讨论】:
标签: .net vb.net multithreading list data-structures
我正在使用 VB.NET。
我想构建一个大型列表(MyClassOrStructure),在初始填充后变为静态。
我将有多个线程需要遍历此列表以读取数据(不写入、插入或删除)
有什么非常糟糕的事情需要我注意吗?
谢谢。
【问题讨论】:
标签: .net vb.net multithreading list data-structures
如果您只是在阅读,那就没问题了。每个迭代器都将独立于其他迭代器。
如果您曾经想知道为什么IEnumerable<T> 接口不直接具有MoveNext() 和Current,而是必须创建一个IEnumerator<T> 实例,这就是为什么 - 列表本身不保留“光标”表示迭代器在哪里,它在IEnumerator<T> 中。在线程之间共享IEnumerator<T> 值几乎肯定是个坏主意——但你不太可能意外地这样做。在多个线程上迭代的自然方式是每个线程有一个IEnumerator<T>,这是安全的(只要您不修改列表)。
【讨论】:
如果值是静态的,我看不出任何需要锁定,但如果你很少写入对象,你可以查看 ReaderWriterLock 类
【讨论】:
如果同时涉及读取和写入,您显然需要某种锁定。 最好的方法是使用读写锁。见ReaderWriterLockSlim。
【讨论】: