我有这段代码:
private List<...> LayPrices;
public Decimal BestLayOdds
{
get
{
if (LayPrices.Count > 0)
{
return LayPrices[0].dOdds;
}
return 1000.0M;
}
}
问题在于,有时列表中有项目,但它不会进入&#39;如果&#39;言。
检查调试会话的以下图像:
这怎么可能?
但是如果我强制它返回第一个项目,在最后一个return语句中,即使列表中有元素,我也会得到一个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)并且问题仍然存在:
所以我认为这不是一个并发问题。
答案 0 :(得分:2)
在Debug.Assert(LayPrices.Count > 0)
语句之前将if
放入getter中,您会发现List
实际上是空的。
唯一合理的解释是你在一些其他线程中填充列表并且你有竞争条件或者只在调试器中触发的属性getter(你也可以在catch子句中填充列表) callstack,但我想你会自己想出来的那样)
为了获得更好的答案,请包含填充列表的所有代码。不仅认为的代码应该运行,而且 all 从列表中添加或删除项目的属性,构造函数或方法。
答案 1 :(得分:1)
我发现了问题。 这确实是并发问题,即使我没有明确地使用线程,我使用事件并且我认为事件处理是同步的(它是同步的吗?)。
如果我在读取或添加到列表的任何地方添加锁,问题就会消失。