繁体   English   中英

c#ArgumentOutOfRangeException

[英]c# ArgumentOutOfRangeException

我有这段代码:

    private List<...> LayPrices;
    public Decimal BestLayOdds
    {
        get
        {
            if (LayPrices.Count > 0)
            {
                return LayPrices[0].dOdds;
            }
            return 1000.0M;   
        }
    }

问题是有时List有项目,但它不会进入'if'语句。

检查调试会话的以下图像:

在此输入图像描述

这怎么可能呢?

但是如果我强制它返回第一个项目,在最后一个return语句中,即使列表中有元素,我也会得到一个ArgumentOutOfRangeException。 检查嵌套图像:

在此输入图像描述

我的代码有什么问题,或者它只是一个愚蠢的错误?

更新:

LayPrices List仅在类Constructor上实例化: LayPrices = new List<PriceStruct>();

它只是在一个方法上填充了项目,其中包含以下代码:

    LayPrices.Clear();
    foreach (PriceSize priceSize in exchangePrices.availableToLay)
    {
          PriceStruct lay = new PriceStruct();
          lay.dOdds = (Decimal)priceSize.price;
          lay.dAmount = (Decimal)priceSize.size;

          LayPrices.Add(lay);
   }

并发问题和线程是我的第一个线索,所以我确实放了一个锁(LayPrices),问题仍然存在:

锁

所以我认为这不是一个并发问题。

Debug.Assert(LayPrices.Count > 0)放在if语句之前的getter中,你会发现List实际上是空的。

唯一合理的解释是你在一些其他线程中填充列表并且你有竞争条件或者只在调试器中触发的属性getter(你也可以在callstack中的catch子句中填充列表但是我想你会自己想出来的)

为了获得更好的答案,请包含填充列表的所有代码。 不仅您认为应该运行的代码,还有从列表中添加或删除项目的所有属性,构造函数或方法。

我发现了这个问题。 这确实是并发问题,即使我没有明确地使用线程,我使用事件并且我认为事件处理是同步的(它是同步的吗?)。

如果我在读到或添加到列表的任何地方添加锁,问题就会消失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM