【问题标题】:"Index was outside the bounds of the array" when adding an item to a generic list将项目添加到通用列表时,“索引超出了数组的范围”
【发布时间】:2017-07-19 15:05:20
【问题描述】:

我刚刚遇到一个独特的错误,即实时站点在登录时抛出“索引超出了数组的范围”。我将错误跟踪到从旧项目继承的旧“计时”文件。这是完整的课程

public class TimingObject
{
    public DateTime timestamp { get; set; }
    public String call { get; set; }
    public TimeSpan duration { get; set; }

    // create a new timing object starting now
    public TimingObject()
    {
        timestamp = DateTime.Now;
    }

    public TimingObject(String call)
    {
        timestamp = DateTime.Now;
        this.call = call;
    }

    public void Stop()
    {
        List<TimingObject> timings;
        if (HttpContextManager.Current.Cache["PageTimings"] == null)
            timings = new List<TimingObject>();
        else
            timings = HttpContextManager.Current.Cache["PageTimings"] as List<TimingObject>;
        this.duration = (DateTime.Now - this.timestamp);
        timings.Add(this);
        HttpContextManager.Current.Cache["PageTimings"] = timings;
    }
}

错误是由timings.Add(this) 引发的。为什么在添加一个项目到列表时会抛出Index was out of bounds

如果列表太大,会发生这种情况吗?它到底有多大?

代码是多余的,已被删除。但我真的很想知道为什么会这样。

【问题讨论】:

  • 确定是错误所在的那一行吗?
  • List&lt;T&gt; 的最大大小为int32.MaxValue,即大约 21.47 亿。但是,因为它是一个内部根据需要增长的数组,如果你最终得到一个超过该值除以二加一的大小,如果它要添加另一个项目并需要增加它的大小,它可能会尝试添加一个索引比它可以处理的大。我不太确定那里的逻辑。
  • 与 rory 和 David 一起,我很想知道缓存中的内容。也许它是被转换为列表的其他东西。

标签: c# arrays indexoutofboundsexception


【解决方案1】:

List&lt;T&gt; 不是线程安全的,这段代码看起来很可疑,就像您从多个线程获取List&lt;T&gt; 的共享实例一样。我怀疑您同时从两个不同的线程添加到列表中,并丢弃了使 List 在幕后工作的数组。

【讨论】:

  • 他可以改用ConcurrentBag&lt;TimingObject&gt; 或使用锁对象来使其线程安全。
猜你喜欢
  • 2015-04-03
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
相关资源
最近更新 更多