安全地迭代可以在另一个线程中更改的数组

时间:2009-11-25 14:41:41

标签: c# multithreading

我希望通过可以被另一个线程更改的数组安全地迭代(不会在迭代期间更改集合)。 我能做到的最好的方法是什么?

5 个答案:

答案 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)

为了超级安全,您可以在迭代时锁定对阵列的所有访问权限。它是确保您迭代的数组完全是最新的唯一方法..