关于winforms:list的多线程场景

Multithreading scenario for list

我已阅读此模式,但发现它不起作用。我得到一个罕见的例外,即 foreach 中的项目已更改。

锁定(我的列表)
{
foreach(var a in myList) {}

myList = new List<>() (或 myList.Clear() )
}

我也试过这个

foreach(var a in myList.ToList() ) { }

这也产生了异常。此线程中描述了一些其他模式,但我想确认/理解为什么上述模式不起作用
我已经阅读了一些关于如何正确锁定列表的内容。该异常并不经常发生——只是非常罕见,而且当时还存在内存泄漏。

1。
我是否需要在修改 myList 的任何地方都使用锁,还是锁会阻止任何人编辑 mylist?这可能是混乱的根源。

2.

lock mylist 和强制转换和使用 syncroot 有区别吗?

看这里

在多线程场景中正确锁定列表< T >?


一般来说,如果您有一个共享资源,那么您需要锁定一个互斥锁,以在您使用该资源时保护该资源。不管是读还是写。如果互斥锁未锁定在您使用共享资源的至少一个地方,那么您就有问题了。例如,如果您只在修改共享资源时锁定它,那么可能某个线程正在读取它,而另一个线程正在修改它——这种情况称为竞争条件。

在您的特定情况下,是的,您需要在修改 mylist 的任何地方锁定它。不仅在您修改它的地方,而且在您阅读它的任何地方。