c# - ObservableCollection 中索引在范围内的不合逻辑 ArgumentOutOfRangeException

标签 c# windows-store-apps windows-store

我使用 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 后,我仍然没有找到任何有关此行为的文档。有人知道这里会发生什么吗?

最佳答案

问题中的代码本身永远不会导致此异常,因为它正确地保护了对计数的访问。因此,唯一的解释是问题中未提及的代码导致异常发生。最可能的原因是

  1. 多线程
  2. 集合的事件处理程序代码

鉴于这是 ObservableCollection<T>我的猜测是#2 最有可能。本质上,某些在集合中查找更改的代码错误地访问了不再有效的值。如果是这种情况,则抛出异常时代码将位于堆栈的最顶部。

关于c# - ObservableCollection 中索引在范围内的不合逻辑 ArgumentOutOfRangeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21371769/

相关文章:

c# - LINQ:为什么叫 "Comprehension Syntax"

c# - 当单击 visual studio 2015 Resharper 上的运行按钮时,我的代码发生了变化

ssl - Windows 应用商店应用程序 : The host name in the certificate is invalid or does not match

wpf - 在 wpf 中显示 xaml 图像

c# - 以编程方式检查 Windows 应用商店应用程序更新

vb.net - 在调用方法中不使用 Await 启动异步任务

c# - 在 mathdotnet 中解析具有双系数值的表达式

c# - 找到两个数组之间差异的更好方法

Windows商店不允许下载应用程序

windows - UWA 和 UWP 应用有什么区别