我使用 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);
}
}
请注意(临时)一般捕获,这不是必需的。我倾向于看似随机地捕获由 RemoveAt
抛出的 ArgumentOutOfRangeException
,即使在给定前述条件且索引成功的情况下索引零应该有效。即便如此,调试消息始终会显示大小 > 0。到目前为止,仅当 UI 线程内的 MediaElement.MediaEnded
调用上述方法时才会发生异常。
在仔细阅读了 msnd 后,我仍然没有找到任何有关此行为的文档。有人知道这里会发生什么吗?
最佳答案
问题中的代码本身永远不会导致此异常,因为它正确地保护了对计数的访问。因此,唯一的解释是问题中未提及的代码导致异常发生。最可能的原因是
- 多线程
- 集合的事件处理程序代码
鉴于这是 ObservableCollection<T>
我的猜测是#2 最有可能。本质上,某些在集合中查找更改的代码错误地访问了不再有效的值。如果是这种情况,则抛出异常时代码将位于堆栈的最顶部。
关于c# - ObservableCollection 中索引在范围内的不合逻辑 ArgumentOutOfRangeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21371769/