索引在绑定异常之外

本文关键字:异常 绑定 索引 | 更新日期: 2023-09-27 18:24:47

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

引发了类型为"System.Web.HttpUnhandledException"的异常。--->System.IndexOutOfRangeException:索引超出了数组的界限。位于System.Collections.Generic.Dictionary `2.插入(TKey键、T值、布尔加法)

我只是不明白这是怎么可能的,我检查了null和密钥是否可用。这是唯一使用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;
            }
        }
    }
}

索引在绑定异常之外

由于您的变量是static,并且错误指示它在web服务器上运行,因此您很可能面临两个线程同时访问同一个值,从而导致同时进行两次添加的问题。

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

  1. 如果您不想在会话之间共享词典,请不要将其设为static。这并不能真正解决问题。这使得它更不可能发生
  2. 使用线程安全字典类型:ConcurrentDictionary