Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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# Get总是返回null_C#_Caching_Memory - Fatal编程技术网

C# Get总是返回null

C# Get总是返回null,c#,caching,memory,C#,Caching,Memory,我的问题是添加ChangeMonitor会阻止缓存Get总是返回null而不是数据 如果没有监视器,数据将被返回 有人对这种行为有想法吗 try { var x = cache.Get(key); if (x != null) { extendedList = x as List<HistoryInformation>; return extendedList; } data = await _client.NewGe

我的问题是添加ChangeMonitor会阻止缓存
Get
总是返回null而不是数据

如果没有监视器,数据将被返回

有人对这种行为有想法吗

try {
    var x = cache.Get(key);

    if (x != null) {
        extendedList = x as List<HistoryInformation>;
        return extendedList;
    }
    data = await _client.NewGetAllLocationHistoryAsync(data);

    list.AddRange(data.List);

    extendedList = extendHistoryList(list);

    CacheItemPolicy policy = new CacheItemPolicy()
    {
        SlidingExpiration = new TimeSpan(0, 1, 0, 0)
    };

    // By the next four lines of code the cache.Get function always returns null!!!

    policy.ChangeMonitors.Add(cache.CreateCacheEntryChangeMonitor(new string[] { cacheName }));
    policy.RemovedCallback = args => {
        log.Info($"GetHistory:{args.CacheItem.Key} ---> {args.RemovedReason}.");
    };

    var v = cache.Add(key, extendedList, policy);

    // Returns null if the lines  "policy.ChangeMonitors.Add ...
    // and                        "policy.RemovedCallback" part of the code.
    var y = cache.Get(key);
}
试试看{
var x=cache.Get(key);
如果(x!=null){
extendedList=x作为列表;
返回扩展列表;
}
data=wait_client.NewGetAllLocationHistoryAsync(数据);
list.AddRange(data.list);
extendedList=extendHistoryList(列表);
CacheItemPolicy policy=新的CacheItemPolicy()
{
SlidingExpiration=新的时间跨度(0,1,0,0)
};
//在接下来的四行代码中,cache.Get函数始终返回null!!!
添加(cache.CreateCacheEntryChangeMonitor(新字符串[]{cacheName}));
policy.RemovedCallback=args=>{
log.Info($“GetHistory:{args.CacheItem.Key}-->{args.RemovedReason}”);
};
var v=cache.Add(键、扩展列表、策略);
//如果行“policy.ChangeMonitors.Add…”返回null。。。
//以及代码的“policy.RemovedCallback”部分。
var y=cache.Get(key);
}

您要求它从缓存中删除该项

缓存是复杂的。根据文档,这是您应该非常小心地实现的事情之一。事实上,您要求的是您不想要的东西

ChangeMonitors
不是指监视缓存的对象。它表示在缓存需要失效时报告的监视器。例如,如果您有一个文件要缓存在内存中,您可以使用文件更改监视器,因此当文件在磁盘上更改时,它会立即在缓存中失效。要获得额外点数,
C如果缓存中不存在密钥,acheEntryChangeMonitor
将立即发出删除通知。将这两种行为放在一起,然后

  • 您可以创建一个新的缓存策略,并使用一个更改监视器来监视键
    cacheName
  • 缓存中没有由
    cacheName
    指定名称的密钥,因此更改监视器会立即将该项注册为已删除
  • 您使用key
    key
    添加了一个缓存项。此操作成功,并将项添加到缓存中。但是,更改监视器说该项应该无效,因此它会立即从缓存中删除
  • Get(key)
    按预期返回null

总而言之:如果要监视缓存中的更改,请使用
RemovedCallback
CacheEntryChangeMonitor
。如果要在其他内容发生更改时使缓存项无效,请使用
ChangeMonitors

是否阅读了缓存监视器上的文档?这似乎是一件相当复杂的事情,因此我不会依赖它并不是所有的缓存实现都支持缓存条目更改监视器。要确定您的缓存实现是否支持CacheEntryChangeMonitor对象,请参阅特定缓存实现的文档。“您使用的缓存是什么?它支持缓存项更改监视器对象吗?谢谢回答。我正在使用内存缓存(
ObjectCache cache=MemoryCache.Default;
)。到目前为止,我了解windows文档。内存缓存支持CacheEntryChangeMOnitor()。你确定
cache.Get
返回空值吗?看起来更像是你得到了一个异常,而你忽略了它并返回空值。你能给出一个最小的完整示例来重现你看到的行为吗?是的,这对我来说是有关联的。我用catch(异常e)捕捉异常{log.Error($“GetHistory:异常{e.Message}”);}。但没有引发异常。对于catch块和缓存声明,这已经是一个完整的小示例。感谢您的解释。当我正确理解您的意思时,我的第一个错误是我尝试监视缓存本身,但监视器用于监视存储在缓存中的对象。如果我理解正确,我必须例如,监视my extendedList?但是,如果我再次调用该函数,从缓存中获取列表并向extendedList添加一个项,那么缓存是否会被删除?老实说,我并不真正理解ChangeMonitor的windos示例。我想,我明白了。CacheEntryChangeMonitor适用于缓存项的情况(即key1)依赖于同一缓存中的另一个缓存项(key2)。因此,如果缓存项(key2)发生某些更改,CacheEntryChangeMonitor(监控key1的key2)必须删除缓存项(key1),以便缓存项(key1)必须重新创建。Luaan,感谢您的帮助!!!无论我是否仍然不允许在视觉上投票支持您的答案,我希望其他开发人员也会这样做。