当数据异步更改时,在类中迭代数据的正确方法

时间:2010-02-09 16:18:46

标签: c# asynchronous iterator

我有一个C#类,里面有一个字典。该类异步侦听消息,这些消息在到达和处理时会更改字典中的数据。

使用此类实例迭代字典数据的应用程序的“正确”方法是什么?我是否必须将其包装到另一个类中并实现某种枚举器?将Pause和Resume方法之类的东西添加到app想要迭代数据时可以调用的类是否合适?

3 个答案:

答案 0 :(得分:1)

好吧,你应该在迭代或修改它时锁定字典。

像这样:

var d = new Dictionary<int, string>();

lock (d)
{
    d.Add(1, "Q");
}

lock (d)
{
    foreach (var p in d)
    {
        Console.WriteLine(p.Key + " => " + p.Value);
    }
}

如果你的迭代要做一些重要的事情,你应该在迭代之前复制。

IList<KeyValuePair<int, string>> d2;

lock (d)
{
    d2 = d.ToList();
}

foreach (var p in d2)
{
    Console.WriteLine(p.Key + " => " + p.Value);
}

答案 1 :(得分:0)

另一种选择是在迭代之前复制数据。

答案 2 :(得分:0)

客户端如何迭代数据有两个选项

  1. 它可以获得相同的同步锁定,用于在进行更新时保护数据。
  2. 负责数据的班级可以将数据的独立副本返回给调用者