【发布时间】:2010-02-09 16:18:46
【问题描述】:
我有一个 C# 类,里面有一个字典。该类异步侦听消息,这些消息在到达和处理后会更改字典中的数据。
对于使用此类的实例来遍历字典中的数据的应用程序,“正确”的方式是什么?我是否必须将它包装到另一个类中并实现某种枚举器?向类中添加 Pause 和 Resume 等方法是否合适,以便应用在需要迭代数据时调用?
【问题讨论】:
标签: c# asynchronous iterator
我有一个 C# 类,里面有一个字典。该类异步侦听消息,这些消息在到达和处理后会更改字典中的数据。
对于使用此类的实例来遍历字典中的数据的应用程序,“正确”的方式是什么?我是否必须将它包装到另一个类中并实现某种枚举器?向类中添加 Pause 和 Resume 等方法是否合适,以便应用在需要迭代数据时调用?
【问题讨论】:
标签: c# asynchronous iterator
好吧,你应该在迭代或修改字典的任何时候锁定它。
像这样:
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);
}
【讨论】:
另一个选项是在迭代之前复制数据。
【讨论】:
对于客户端如何迭代数据,实际上有 2 个选项
【讨论】: