【发布时间】:2013-01-15 16:51:42
【问题描述】:
我已阅读此模式,但发现它不起作用。我遇到了一个罕见的异常,即 foreach 中的项目已更改。
锁定(我的列表) { foreach(var a in myList) {}
myList = new List() (或 myList.Clear() ) }
我也试过了
foreach(var a in myList.ToList()) { }
这也产生了异常。此线程中描述了一些其他模式,但我想确认/理解为什么上述模式不起作用 我已经阅读了一些关于如何正确锁定列表的内容。该异常并不经常发生——只是非常罕见,而且当时还存在内存泄漏。
1。 我是否需要在修改 myList 的任何地方都使用该锁,或者该锁是否会阻止任何人编辑 mylist?这可能是混乱的根源。
2.
lock mylist 和强制转换和使用 syncroot 有区别吗?
看这里
【问题讨论】:
-
关于 1:是的,您需要锁定修改列表甚至读取列表的任何位置。这就是应该使用锁的方式。
-
这里有一本很棒的(免费的)电子书:
Albahari
标签: winforms multithreading list