我希望通过可以被另一个线程更改的数组安全地迭代(不会在迭代期间更改集合)。 我能做到的最好的方法是什么?
答案 0 :(得分:4)
制作副本?我想这取决于你是否希望你的迭代成为'及时快照',或者你是否希望看到变化'实时'。后者可能非常冒险。
答案 1 :(得分:4)
“安全”是什么意思?你介意看到新旧价值的混合物吗?如果是这样,您可以使用foreach
进行迭代。 (这有两个原因:首先,数组没有像List<T>
那样的内部“版本号”,因此迭代器无法检测到数组已更改。其次,使用foreach
on在C#中已知为数组的类型会导致编译器无论如何都使用长度和索引器,而不是使用迭代器。)
如果你想获得一个快照,你基本上需要获取一个数组的副本并迭代它。
编辑:我假设你想要并发。 (我不确定为什么我会这么做。)我同意其他答案,即锁定是另一种选择 - 但你需要锁定整个迭代,例如。lock (someLock)
{
foreach (var x in array)
{
// Stuff
}
}
同样在写作主题中:
lock (someLock)
{
array[0] = "foo";
}
(您可以锁定阵列本身,但我通常更喜欢私有锁。)
答案 2 :(得分:4)
目标4.0并使用众多thread safe collections.
中的一个答案 3 :(得分:0)
您可能希望使用同步访问。您可以将阵列锁定到需要解析它的时间以及添加/删除项目的时间。
您可以使用锁定/解锁(http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx
答案 4 :(得分:0)
为了超级安全,您可以在迭代时锁定对阵列的所有访问权限。它是确保您迭代的数组完全是最新的唯一方法..