【发布时间】:2020-02-05 09:53:07
【问题描述】:
我的问题是添加 ChangeMonitor 会阻止缓存。 Get 总是返回 null 而不是 data。
没有监视器,数据将被返回。
有人对这种行为有想法吗?
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);
}
【问题讨论】:
-
您是否阅读过有关缓存监视器的文档?这似乎是一件相当复杂的事情,所以我不会仅仅依靠它。
-
引用:“并非所有缓存实现都支持缓存条目更改监视器。要确定您的缓存实现是否支持 CacheEntryChangeMonitor 对象,请参阅特定缓存实现的文档。”你用的是什么缓存?是否支持缓存条目更改监控对象?
-
感谢您的回复。我正在使用内存缓存 (
ObjectCache cache = MemoryCache.Default;)。到目前为止,我了解 Windows 文档。内存缓存支持 CacheEntryChangeMOnitor (docs.microsoft.com/de-de/dotnet/api/…)。 -
您确定
cache.Get返回的是空值吗?它看起来更像是您遇到了一个您忽略并返回 null 的异常。您能否制作一个最小的完整示例来重现您所看到的行为? -
是的,这对我来说是有线的。我用 catch (Exception e) { log.Error($"GetHistory: Exception {e.Message}"); 捕获异常}。但是没有抛出异常。加上catch块和缓存声明,已经是一个完整的小例子了。