【问题标题】:proper way to iterate through data in a class when the data changes asynchronously当数据异步更改时,迭代类中数据的正确方法
【发布时间】:2010-02-09 16:18:46
【问题描述】:

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

对于使用此类的实例来遍历字典中的数据的应用程序,“正确”的方式是什么?我是否必须将它包装到另一个类中并实现某种枚举器?向类中添加 Pause 和 Resume 等方法是否合适,以便应用在需要迭代数据时调用?

【问题讨论】:

    标签: c# asynchronous iterator


    【解决方案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);
    }
    

    【讨论】:

    • 是的,我现在正在做原型设计,但我不喜欢公开的字典对象...所以我可以创建几个公共方法来结束获取和释放锁,但我想知道这种情况是否有更标准的模式。
    【解决方案2】:

    另一个选项是在迭代之前复制数据。

    【讨论】:

      【解决方案3】:

      对于客户端如何迭代数据,实际上有 2 个选项

      1. 它可以获取与同步更新时用于保护数据相同的同步锁。
      2. 负责数据的类可以将数据的独立副本返回给调用者

      【讨论】:

        猜你喜欢
        • 2015-08-24
        • 1970-01-01
        • 2016-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-16
        相关资源
        最近更新 更多