【发布时间】:2010-06-27 21:02:57
【问题描述】:
我有一个 List 集合,我想在多线程应用程序中对其进行迭代。每次迭代时我都需要保护它,因为它可以更改,并且我不希望在执行 foreach 时出现“集合已修改”异常。
这样做的正确方法是什么?
每次访问或循环时都使用锁定。我比较害怕死锁。也许我只是偏执于使用锁,不应该。如果我走这条路以避免死锁,我需要知道什么?锁相当有效吗?
每次执行 foreach 时,都使用 List.ToArray() 复制到数组。这会导致性能下降,但很容易做到。我担心内存抖动以及复制它的时间。只是显得过分。使用 ToArray 是线程安全的吗?
不要使用 foreach 而是使用 for 循环。每次我这样做以确保列表没有缩小时,我不需要进行长度检查吗?这看起来很烦人。
【问题讨论】:
-
列表可能是目前最安全的数据结构!
-
您可以使用CHESS - An automated Concurrency Testing Tool 和MSDN 测试您的假设
标签: c# multithreading foreach locking toarray