代码之家  ›  专栏  ›  技术社区  ›  Chen Kinnrot

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

  •  1
  • Chen Kinnrot  · 技术社区  · 15 年前

    5 回复  |  直到 15 年前
        1
  •  4
  •   n8wrl    15 年前

    复印一份?我想这取决于你是想让你的迭代成为一个“及时的快照”,还是想看到“实时”的变化。后者会变得相当危险。

        2
  •  4
  •   Jon Skeet    15 年前

    foreach . (这有两个原因:首先,数组没有像 List<T> 是,因此迭代器无法检测到数组已更改。第二,使用 弗雷奇

    如果要获取快照,基本上需要获取数组的副本并对其进行迭代。

    lock (someLock)
    {
        foreach (var x in array)
        {
            // Stuff
        }
    }
    

    同样,在写作线索中:

    lock (someLock)
    {
        array[0] = "foo";
    }
    

        3
  •  4
  •   user1228 user1228    15 年前

    以4.0为目标,使用其中一种 thread safe collections.

        5
  •  0
  •   Mongus Pong    15 年前

    为了超级安全,可以在遍历数组时锁定对该数组的所有访问。这是确保所遍历的数组完全是最新的唯一方法。。