Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 缓存元数据内容索引超出了数组的范围_C#_Asp.net_Asp.net Mvc_Garbage Collection - Fatal编程技术网

C# 缓存元数据内容索引超出了数组的范围

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

在应用程序中,有一个类控制不断重复使用的某些数据的缓存

我们已经让这段代码运行了大约一年,但是最近,随着应用程序(asp.NETMVC5)的增长,它抛出了一个错误

尝试添加更多时,索引超出了数组的边界 将数据输入其中

它已通过重新启动IIS服务器修复

我们如何改进/修改此代码以避免错误

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
,但如果您不熟悉编写多线程代码,我会坚持使用
缓存
类中已有的“开箱即用”功能。通过这些,您可以了解内置缓存