列表的多线程场景

时间:2013-01-15 16:51:42

标签: winforms multithreading list

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

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

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

我也试过这个

foreach(myList.ToList()中的var a {}

这也产生了异常。此线程中描述了一些其他模式,但我想确认/理解为什么上面的模式不起作用 我已经阅读了一些关于如何正确锁定列表的内容。例外情况并不经常发生 - 很少发生,当时也有内存泄漏。

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

2

锁定mylist和转换以及使用syncroot有区别吗?

见这里

Properly locking a List<T> in MultiThreaded Scenarios?

1 个答案:

答案 0 :(得分:1)

通常,如果您有共享资源,则需要在使用此资源时锁定保护资源的互斥锁。如果它只是阅读或写作无关紧要。如果互斥锁未锁定在您使用共享资源的至少一个位置,则表示您遇到问题。例如,如果您在修改共享资源时仅锁定共享资源,那么某些线程可能正在读取它而另一个线程正在修改它 - 这种情况称为竞争条件。

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