我做了很多测试,我的MemoryCache实例在一段时间后被释放,并且当我调用Get方法时总是返回null。我认为这是在PollingInterval之后。
要模拟您可以启动新的webapp并编写此代码:
private static MemoryCache mem = new MemoryCache("MyCache");
protected void Page_Load(object sender, EventArgs e)
{
string key = "MyKey";
mem.Set(key, "MyValue", new CacheItemPolicy() {AbsoluteExpiration = DateTimeOffset.Now.AddDays(1), Priority = CacheItemPriority.NotRemovable});
LtrValue.Text = mem.Get(key) as string;
}
我将PollingInterval配置为30小时似乎有效。
我认为可能是AppDomain卸载,但经过一些调查我不认为是这样:
1-)MSDN说要使用MemoryCache for ASP.NET:http://msdn.microsoft.com/en-us/library/ff477235(v=vs.100).aspx 并说ASP.NET 4缓存是使用ObjectCache构建的:
在ASP.NET 4中,使用ObjectCache类实现缓存。
2-)AppDomain unload将重置静态变量,创建新的MemoryCache实例。
3-)我将一个事件附加到AppDomain卸载,就像MemoryCache一样(我看到反编译的源代码)在我的测试中它没有被调用,而memorycache被处理掉了。
参考文献:
MSDN论坛上的同一篇文章:http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/1233ffb3-6480-431b-94ca-1190f96cf5f6
http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/0a666d5e-9bda-47bd-8dd3-98d32eb5fe60
MemoryCache Empty : Returns null after being set
System.Runtime.Caching.MemoryCache strange behavior?
答案 0 :(得分:1)
它确实是一个错误,它已在.NET 4.5中修复,并且它们正在努力反向移植到.NET 4
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/1233ffb3-6480-431b-94ca-1190f96cf5f6/