.net 集合上的多线程问题

.net 集合上的多线程问题,.net,vb.net,multithreading,collections,monitor,.net,Vb.net,Multithreading,Collections,Monitor,我的应用程序中存在线程问题 与线程问题一样,线程问题并非总是发生。 有时,此代码上会发生collectionChanged异常: SyncLock _padLock System.Threading.Monitor.Enter(serie) For Each dat In serie.Lignes WriteLine(dat.Columns(), False, 0, False)'exception here Nex

我的应用程序中存在线程问题

与线程问题一样,线程问题并非总是发生。 有时,此代码上会发生collectionChanged异常:

    SyncLock _padLock
        System.Threading.Monitor.Enter(serie)
        For Each dat In serie.Lignes
            WriteLine(dat.Columns(), False, 0, False)'exception here
        Next
        System.Threading.Monitor.Exit(serie)
    End SyncLock
基本上,一个系列包含线,线是对象的数组

如果我在该对象上有监视器锁,为什么另一个线程能够修改该系列

另外,我似乎看不到什么时候分区被锁定,是否有一种特定的方式来锁定

编辑:

我修改了代码以便正确地锁定。那只虫子不见了。但是现在我想找出我的另一个bug。 这是一个非常棘手的问题,因为有时我会得到一个意外的结果(高度由于比赛),但当我的代码中有断点时,我永远无法重现它

这真是一个令人毛骨悚然的局面

你能使用.Net 4.0吗
ConcurrentBag是支持您的收藏的更好的类型,因此是线程安全的。
您当前锁定了两次(_padLock和serie),但这并不能防止任何人在未锁定的情况下修改集合。

另一种选择是创建集合的本地副本并围绕此副本循环,但这并不能消除竞争。

修改集合的代码是否也同步了?(例如,是否使用同一对象进行锁定?)否,修改集合的代码未同步。但是如果我锁定了对象,应该只允许一个线程访问它不?@squelos-锁不保护对象,它会投射代码块。因此,您需要将每个可以修改“serie”或“serie.Lignes”的代码块包装在同一对象的锁中。@squelos-Hans是对的。虽然使用新的并发集合将消除您的问题,但我认为最好花一些时间来了解锁定/线程在一般情况下是如何工作的-这可能会对您的未来有更多帮助。是的,我可以使用.net 4.0。我四处看看。我真的不熟悉线程。