Winforms 列表的多线程场景

Winforms 列表的多线程场景,winforms,multithreading,list,Winforms,Multithreading,List,我读过这个模式,但发现它不起作用。我得到一个罕见的例外,foreach中的一个项目被更改了 锁(mylist) { foreach(myList中的var a){} myList=新列表()(或myList.Clear()) } 我也试过这个 foreach(myList.ToList()中的变量a){} 这也产生了例外情况。本线程中还描述了一些其他模式,但我想确认/理解上述模式不起作用的原因 我读过一些关于如何正确锁定列表的内容。这种异常并不经常发生——只是很少发生,而且当时还存在内存泄漏 一

我读过这个模式,但发现它不起作用。我得到一个罕见的例外,foreach中的一个项目被更改了

锁(mylist) { foreach(myList中的var a){}

myList=新列表()(或myList.Clear()) }

我也试过这个

foreach(myList.ToList()中的变量a){}

这也产生了例外情况。本线程中还描述了一些其他模式,但我想确认/理解上述模式不起作用的原因 我读过一些关于如何正确锁定列表的内容。这种异常并不经常发生——只是很少发生,而且当时还存在内存泄漏

一,。 我是否需要在修改myList的任何地方使用锁,或者该锁是否阻止任何人编辑myList?这可能是混乱的根源

二,

锁定mylist和强制转换以及使用syncroot是否有区别

看这里


通常,如果您有一个共享资源,则需要锁定一个互斥锁,以便在使用该资源时保护该资源。不管是读还是写。如果互斥锁未锁定在使用共享资源的至少一个位置,则会出现问题。例如,如果您仅在修改共享资源时锁定它,则可能是某个线程正在读取它,而另一个线程正在修改它—这种情况称为竞争条件


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

关于1:是的,您需要锁定您修改列表的任何地方,甚至从列表中读取的任何地方。这就是锁的使用方式。这里有一本很棒(免费)的电子书: