索引异常之外的索引

时间:2014-09-26 07:24:40

标签: c# exception dictionary static

我有以下代码,不知怎的,昨天晚上它抛出了很多例外:

  

抛出了类型'System.Web.HttpUnhandledException'的异常。 ---> System.IndexOutOfRangeException:索引超出了数组的范围。      在System.Collections.Generic.Dictionary`2.Insert(TKey键,TValue值,布尔加法)

我只是看不出这是怎么可能的,我检查是否为空,如果密钥可用。这是使用lastTimeoutCheck的唯一方法。

private static Dictionary<string, DateTime> lastTimeoutCheck;
private static readonly object CacheLock = new object();
private static void CheckTimeout(string groupName)
{
    if (lastTimeoutCheck == null)
    {
        lastTimeoutCheck = new Dictionary<string, DateTime>();
        return;
    }
    if (!lastTimeoutCheck.ContainsKey(groupName))
    {
        lastTimeoutCheck.Add(groupName, DateTime.UtcNow);
        return;
    }

    if (lastTimeoutCheck[groupName] <
        DateTime.UtcNow.AddMinutes(-GroupConfigSection.TimeOutCheckMinutes))
    {
        lock (CheckLock)
        {
            if (lastTimeoutCheck[groupName] <
                DateTime.UtcNow.AddMinutes(-GroupConfigSection.TimeOutCheckMinutes))
            {
                GroupHolder groupHolder =
                    (GroupHolder) System.Web.HttpContext.Current.Cache.Get(groupName);
                if (groupHolder != null)
                {
                    groupHolder.UpdateTime();
                }

                lastTimeoutCheck[groupName] = DateTime.UtcNow;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:4)

由于您的变量为static并且错误表明它在Web服务器上运行,因此您很可能面临两个线程同时访问相同值的问题,导致同时发生两次添加

解决方案取决于您的情况:

  1. 如果您不打算在会话中共享字典,请不要创建字典static。这并没有真正解决问题。它使它更不可能发生;
  2. 使用线程安全字典类型:ConcurrentDictionary