查询ConcurrentDictionary时有两个不同的结果

时间:2019-05-21 13:00:12

标签: c#

我有一个ConcurrentDictionary,其中包含class个对象。 ConcurrentDictionary每100毫秒更新一次。 Position对象包含一个名为CalcNet()的函数,该函数返回总和。

当循环ConcurrentDictionary值(包含Position对象)时,我得到两个不同的结果。

每个迭代使用不同的方法并获得不同的结果。

  1. Relations.GetEnumerator()
  2. Relations.Values.Sum(x => x.Net());

代码:

    public ConcurrentDictionary<string, Position> _relations = new ConcurrentDictionary<string, Position>();
    public ConcurrentDictionary<string, Position> Relations { get { return _relations; } private set { _relations = value; } }


    public decimal CalcNet()
    {
        decimal positive = 0;
        decimal negative = 0;            

        var enumerator = Relations.GetEnumerator();
        while (enumerator.MoveNext())
        {
            var item = enumerator.Current.Value;
            var net = item.Net();
            if(net > 0)
                positive += net;
            else
                negative += net;
        }

        var lastNetCalc = (negative + positive);

        var testSum = Relations.Values.Sum(x => x.Net());
        if (lastNetCalc != testSum)
        {
            // why?   
        }

        return lastNetCalc;
    }                                    

为什么if (lastNetCalc != testSum)? 预期结果应该相同。

1 个答案:

答案 0 :(得分:0)

您的应用多久符合一次lastNetCalc != testSum条件? 可能是:

  //while loop is ended
  var lastNetCalc = (negative + positive);
  //new value is added to dictionary
  var testSum = Relations.Values.Sum(x => x.Net());
  //lastNetCalc  is not equal testSum for this case 

可以提供Net()方法的定义吗?这样会改变Position类的内部状态吗?

        private decimal _n = 0;
        public decimal Net()
        {
            return ++_n;
        }