gpt4 book ai didi

ASP.NET 缓存和文件依赖项

转载 作者:行者123 更新时间:2023-12-02 18:26:22 24 4
gpt4 key购买 nike

我希望在触及特定文件时回收 ASP.NET 缓存项,但以下代码不起作用:

                       HttpContext.Current.Cache.Insert(
"Key",
SomeObject,
new CacheDependency(Server.MapPath("SomeFile.txt")),
DateTime.MaxValue,
TimeSpan.Zero,
CacheItemPriority.High,
null);

当我访问缓存时,似乎没有检查“SomeFile.txt”,并且修改它不会导致该项目无效。

我做错了什么?

最佳答案

解决的问题:

这是一个独特且有趣的问题,因此我将在这里记录原因和解决方案作为答案,供 future 的搜索者使用。

我在问题中遗漏的一点是,此缓存插入发生在实现单例模式的服务类中。

简而言之:

public class Service 
{
private static readonly Service _Instance = new Service();
static Service () { }
private Service () { }

public static Service Instance
{
get { return _Instance; }
}

// The expensive data that this service exposes
private someObject _data = null;

public someObject Data
{
get
{
if (_data == null)
loadData();
return _data;
}
}


private void loadData()
{
_data = GetFromCache();
if (_data == null)
{
// Get the data from our datasource
_data = ExpensiveDataSourceGet();

// Insert into Cache
HttpContext.Current.Cache.Insert(etc);
}
}
}

这对某些人来说可能是显而易见的,但罪魁祸首是单例模式中的延迟加载。我太着急于认为缓存没有失效,以至于我忘记了只要工作进程还活着,单例的状态就会持续存在。

Cache.Insert 有一个重载,允许您在删除缓存项时指定一个事件处理程序,我的第一个测试是创建一个虚拟处理程序并在其中设置一个断点。当我看到缓存被清除时,我意识到“_data”没有被重置为空,因此对单例的下一个请求加载了延迟加载的值。

从某种意义上说,我是双重缓存,虽然单例缓存的生命周期很短,但足够长到令人讨厌。

解决方案?

 HttpContext.Current.Cache.Insert(
"Key",
SomeObject,
new CacheDependency(Server.MapPath("SomeFile.txt")),
DateTime.MaxValue,
TimeSpan.Zero,
CacheItemPriority.High,
delegate(string key, object value, CacheItemRemovedReason reason)
{
_data = null;
}
);

当缓存被清除时,单例内的状态也必须被清除...问题解决了。

这里学到了什么?不要将状态放入单例中。

关于ASP.NET 缓存和文件依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/804808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com