Jas*_*son 5 .net c# caching c#-4.0 memorycache
我试图在对其依赖的其他条目进行更改时从MemoryCache中逐出条目.这是通过为依赖键的依赖项创建缓存条目更改监视器来设置的:
public bool AddToCache(string key, object dataItem,
DateTimeOffset absoluteExpiration, IEnumerable<string> dependencyKeys)
{
bool result = false;
if (!string.IsNullOrWhiteSpace(key) && dataItem != null)
{
CacheItemPolicy policy = new CacheItemPolicy {
AbsoluteExpiration = absoluteExpiration
};
if (masterKeys != null && masterKeys.Any())
{
policy.ChangeMonitors.Add(
this.provider.Cache.
CreateCacheEntryChangeMonitor(dependencyKeys));
foreach (ChangeMonitor monitor in policy.ChangeMonitors)
{
monitor.NotifyOnChanged(this.OnDependencyChanged);
}
}
result = this.provider.Cache.Add(key, dataItem, policy);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
该OnChangedCallBack方法是这样的:
private void OnDependencyChanged(object state)
{
// what do I do here as "state" is always null?
}
Run Code Online (Sandbox Code Playgroud)
这些项目按预期添加到缓存中,并且在OnDependencyChanged对受监视的键进行更改时按预期调用该方法,但是传递给它的"state"实例始终为null,这意味着我对缓存一无所知密钥的依赖性已经改变,因此不能执行计划的驱逐.
我在这里错过了什么,我是否会以错误的方式解决这个问题?
小智 6
用作参数的委托OnChangedCacheEntry是:
public delegate void OnChangedCallback(object state);
Run Code Online (Sandbox Code Playgroud)
所以你必须这样称呼它:
monitor.NotifyOnChanged(delegate {
OnChangedCacheEntry(OnDependencyChanged(dependencyKeys)); });
Run Code Online (Sandbox Code Playgroud)
然后,您将可以访问OnDependencyChanged中的依赖项键
private void OnDependencyChanged(object state)
{
IEnumerable<string> dependencyKeys = (IEnumerable<string>) state;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5517 次 |
| 最近记录: |