我有这段代码:
private List<...> LayPrices;
public Decimal BestLayOdds
{
get
{
if (LayPrices.Count > 0)
{
return LayPrices[0].dOdds;
}
return 1000.0M;
}
}
问题是有时 List 有项目,但它没有进入“if”语句。
检查下面的调试 session 图像:
这怎么可能?
但是如果我强制它返回第一项,在最后一个返回语句中,我会得到一个 ArgumentOutOfRangeException,即使列表有元素。检查巢图像:
我的代码有什么问题还是只是一个愚蠢的错误?
更新:
LayPrices
列表仅在类构造函数上实例化: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 中填充列表(您也可以在 catch 子句中填充列表调用堆栈,但我想你会自己想出来的)
为了获得更好的答案,请包括填充您的列表的所有代码。不仅您认为应该运行的代码,所有在列表中添加或删除项目的属性、构造函数或方法。
关于C#ArgumentOutOfRangeException异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25445977/