C# 缓存元数据内容索引超出了数组的范围
在应用程序中,有一个类控制不断重复使用的某些数据的缓存 我们已经让这段代码运行了大约一年,但是最近,随着应用程序(asp.NETMVC5)的增长,它抛出了一个错误 尝试添加更多时,索引超出了数组的边界 将数据输入其中 它已通过重新启动IIS服务器修复 我们如何改进/修改此代码以避免错误C# 缓存元数据内容索引超出了数组的范围,c#,asp.net,asp.net-mvc,garbage-collection,C#,Asp.net,Asp.net Mvc,Garbage Collection,在应用程序中,有一个类控制不断重复使用的某些数据的缓存 我们已经让这段代码运行了大约一年,但是最近,随着应用程序(asp.NETMVC5)的增长,它抛出了一个错误 尝试添加更多时,索引超出了数组的边界 将数据输入其中 它已通过重新启动IIS服务器修复 我们如何改进/修改此代码以避免错误 public class DataCache { private static Dictionary<string, CacheEntry> _cacheEntries = new Dicti
public class DataCache
{
private static Dictionary<string, CacheEntry> _cacheEntries = new Dictionary<string, CacheEntry>();
public static bool Exists(string cacheId)
{
// Check if cache entry is valid.
if (_cacheEntries.ContainsKey(cacheId) && DateTime.UtcNow < _cacheEntries[cacheId].CacheUntil)
return true;
return false;
}
public static object Get(string cacheId)
{
// Return entry.
if (_cacheEntries.ContainsKey(cacheId))
return _cacheEntries[cacheId].Data;
else
return null;
}
public static void Put(object cacheObj, string cacheId, DateTime cacheUntil)
{
// Create new cache entry.
CacheEntry e = new CacheEntry()
{
Data = cacheObj,
CacheUntil = cacheUntil
};
// Delte pre-existing items.
if (_cacheEntries.ContainsKey(cacheId))
_cacheEntries.Remove(cacheId);
// Insert it into cache.
_cacheEntries.Add(cacheId, e);
}
class CacheEntry
{
public object Data;
public DateTime CacheUntil;
}
}
公共类数据缓存
{
私有静态字典_cacheEntries=新字典();
存在公共静态bool(字符串cacheId)
{
//检查缓存项是否有效。
if(_cacheEntries.ContainsKey(cacheId)&&DateTime.UtcNow<_cacheEntries[cacheId].CacheUntil)
返回true;
返回false;
}
公共静态对象Get(字符串cacheId)
{
//返回条目。
if(_cacheEntries.ContainsKey(cacheId))
返回_cacheEntries[cacheId]。数据;
其他的
返回null;
}
公共静态void Put(对象cacheObj、字符串cacheId、日期时间cacheUntil)
{
//创建新的缓存项。
CacheEntry e=新的CacheEntry()
{
Data=cacheObj,
CacheUntil=CacheUntil
};
//挖掘已有的项目。
if(_cacheEntries.ContainsKey(cacheId))
_cacheEntries.Remove(cacheId);
//将其插入缓存。
_cacheEntries.Add(cacheId,e);
}
类缓存项
{
公共对象数据;
公共日期时间缓存到;
}
}
它不是线程安全的。更多使用/更多流量=并发问题。看看内置的缓存机制和.Net中已有的并发集合。从中可以准确地获得错误、调试、跟踪或写入日志文件的详细信息,并找到该语句,这样做很容易。这意味着它没有在指定的索引中定位值。由于它是旧系统,您无法重写整个系统,但至少您可以尝试使用堆栈跟踪记录错误详细信息。嗨,蒂姆,您知道我可以在哪里找到有关内置缓存功能的更多信息吗?-您也可以修改现有代码以使用ReaderWriterLockSlim
,但如果您不熟悉编写多线程代码,我会坚持使用缓存
类中已有的“开箱即用”功能。通过这些,您可以了解内置缓存