我使用ObservableCollection
(_queue
)作为队列来显示项目流。我有一个非异步next
方法,其中包含以下相关代码片段:
if (_queue.Count > 0) {
try {
playingTrack = _queue[0];
_queue.RemoveAt(0);
}
catch (Exception e) {
Debug.WriteLine("Failed to remove first of queue size="+_queue.Count);
}
}
注意(临时)一般捕获,这是不必要的。我倾向于随机地捕捉ArgumentOutOfRangeException
RemoveAt
抛出的MediaElement.MediaEnded
,即使索引零在前一个条件下应该是有效的并且索引成功。即便如此,调试消息总是显示大小> 0.到目前为止,只有当{0}中的{{1}}调用上述方法时才会发生异常。
在msnd上下阅读之后,我仍然没有找到有关此行为的任何文档。有没有人知道这里会发生什么?
答案 0 :(得分:2)
问题中的代码本身永远不会导致此异常,因为它可以正确地保护对计数的访问。因此,唯一的解释是问题中未提及的代码导致异常发生。最可能的原因是
鉴于这是ObservableCollection<T>
,我的猜测是#2最有可能。基本上一些正在寻找集合中的变化的代码错误地访问了不再有效的值。如果是这种情况,则抛出异常时代码将位于堆栈的最顶层。