索引在绑定异常之外
本文关键字:异常 绑定 索引 | 更新日期: 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服务器上运行,因此您很可能面临两个线程同时访问同一个值,从而导致同时进行两次添加的问题。
解决方案取决于您的情况:
- 如果您不想在会话之间共享词典,请不要将其设为
static
。这并不能真正解决问题。这使得它更不可能发生 - 使用线程安全字典类型:
ConcurrentDictionary