Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当数据异步更改时,通过类中的数据进行迭代的正确方法_C#_Asynchronous_Iterator - Fatal编程技术网

C# 当数据异步更改时,通过类中的数据进行迭代的正确方法

C# 当数据异步更改时,通过类中的数据进行迭代的正确方法,c#,asynchronous,iterator,C#,Asynchronous,Iterator,我有一个C#类,里面有一本字典。该类异步侦听消息,这些消息在到达和处理时会更改字典中的数据 对于使用此类实例迭代字典中的数据的应用程序,“正确”的方法是什么?我是否必须将它封装到另一个类中并实现某种枚举器?在类中添加Pause和Resume方法是否合适,应用程序可以在需要迭代数据时调用这些方法?那么,在迭代或修改字典时,应该锁定字典 像这样: var d = new Dictionary<int, string>(); lock (d) { d.Add(1, "Q"); }

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


对于使用此类实例迭代字典中的数据的应用程序,“正确”的方法是什么?我是否必须将它封装到另一个类中并实现某种枚举器?在类中添加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对象是公共的……所以我可以创建一些公共方法来结束获取和释放锁的过程,但是我想知道对于这种情况是否有更标准的模式。