【发布时间】:2018-12-19 15:46:51
【问题描述】:
我正在使用 LineSeries 从 Beto Rodriguez 的库 LiveCharts.Wpf 中绘制图表。我将值发送到它绘制并相应更新的图表。 我有一个 SeriesCollection,我根据计数器添加值并删除一些值,例如:
if (_counter > 2 )
{
SeriesCollection[3].Values[_counter-2] = double.NaN;
}
因此,如果计数器大于 2,我将值设置为 NaN,即我从图表中删除一个点。
问题是,在随机时间,我得到一个System.ArgumentOutOfRangeException,它说
索引超出范围。必须是非负数且小于集合的大小。
在值被设置为NaN 并且调试器显示计数器等于0 的位置。
很明显,当计数器在这个if (_counter > 2 ) 条件下等于或小于2 时,我不允许执行这段代码,那么这个异常怎么会发生在这个特定的点上呢?
编辑:这个问题不是关于“System.ArgumentOutOfRangeException”是什么,正如在重复问题中所指出的那样,而是关于这个错误是如何发生的,尽管提前检查了它。基本上,由于多线程,_counter 的值被设置为代码中其他地方的意外值,这是主要问题。 SeriesCollection[3] 与异常无关,如果有人这么认为,我建议从 LiveCharts 库本身中查看此数据类型的实际含义。
【问题讨论】:
-
如果
_counter根本不代表Values数组的实际大小,它会出现......你为什么不检查SerisCollection[3].Values.Length? (即使这也不是线程安全的,如果这很重要的话)。 -
这可能是问题 "SeriesCollection[3]" 吗?
-
如果调试器显示 _counter 为零,那么我的猜测是你的程序是多线程的,另一个线程已经更新了你的 if 和赋值之间的值。
-
是否有另一个线程改变了
_counter?更安全的实现是var i = _counter - 2; if (i >= 0) { SeriesCollection[3].Values[i] = double.NaN; } -
@PaulF 我不这么认为,那是 LineSeries 的概念,我还有一些其他的 SeriesCollection[x]。
标签: c# wpf exception-handling livecharts