C# 当数据异步更改时,通过类中的数据进行迭代的正确方法
我有一个C#类,里面有一本字典。该类异步侦听消息,这些消息在到达和处理时会更改字典中的数据C# 当数据异步更改时,通过类中的数据进行迭代的正确方法,c#,asynchronous,iterator,C#,Asynchronous,Iterator,我有一个C#类,里面有一本字典。该类异步侦听消息,这些消息在到达和处理时会更改字典中的数据 对于使用此类实例迭代字典中的数据的应用程序,“正确”的方法是什么?我是否必须将它封装到另一个类中并实现某种枚举器?在类中添加Pause和Resume方法是否合适,应用程序可以在需要迭代数据时调用这些方法?那么,在迭代或修改字典时,应该锁定字典 像这样: var d = new Dictionary<int, string>(); lock (d) { d.Add(1, "Q"); }
对于使用此类实例迭代字典中的数据的应用程序,“正确”的方法是什么?我是否必须将它封装到另一个类中并实现某种枚举器?在类中添加Pause和Resume方法是否合适,应用程序可以在需要迭代数据时调用这些方法?那么,在迭代或修改字典时,应该锁定字典 像这样:
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);
}
}
var d=newdictionary();
锁(d)
{
d、 添加(1,“Q”);
}
锁(d)
{
foreach(d中的var p)
{
控制台写入线(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);
}
IList-d2;
锁(d)
{
d2=d.ToList();
}
foreach(d2中的var p)
{
控制台写入线(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);
}
是的,我现在在进行原型设计时就这样做了,但是我不喜欢dictionary对象是公共的……所以我可以创建一些公共方法来结束获取和释放锁的过程,但是我想知道对于这种情况是否有更标准的模式。