- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将 MemoryCache 与 Sql 依赖项一起使用。我注意到当使用 MemoryCache.Set() 时,如果集合中的某个项目被覆盖,则会发生内存泄漏。考虑以下场景:
-> Item key=a 确实已从缓存中删除,但其内存仍在 MemoryCache 中。只有当数据库中 Table1 的数据发生变化时,内存才会被释放。
复制代码:
public partial class Form1 : Form
{
const string cs = @"Data Source=.\sqlexpress;Initial Catalog=TestDB;";
public Form1()
{
SqlDependency.Start(cs);
InitializeComponent();
}
MemoryCache memCache = new MemoryCache("test1", new NameValueCollection {
{ "pollingInterval", "00:00:03"}});
private void button2_Click(object sender, EventArgs e)
{
var dep1 = GetDep("SELECT ID FROM dbo.Table1");
var dep2 = GetDep("SELECT ID FROM dbo.Table2");
var policy = new CacheItemPolicy();
policy.SlidingExpiration = new TimeSpan(2, 0, 0);
policy.ChangeMonitors.Add(new SqlChangeMonitor(dep1));
memCache.Set("a", GetSB(), policy);
var policy2 = new CacheItemPolicy();
policy2.SlidingExpiration = new TimeSpan(2, 0, 0);
policy2.ChangeMonitors.Add(new SqlChangeMonitor(dep2));
memCache.Set("a", GetSB(), policy2);
}
private object GetSB()
{
StringBuilder sb = new StringBuilder(100000000);
for (var i = 0; i < sb.Capacity; i++)
{
sb.Append("1");
}
return sb.ToString();
}
private static SqlDependency GetDep(string sql)
{
SqlConnection con = new SqlConnection(cs);
var cmd = new SqlCommand(sql, con);
SqlDependency dep = new SqlDependency(cmd);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
return dep;
}
private void button3_Click(object sender, EventArgs e)
{
GC.Collect();
GC.WaitForPendingFinalizers();
MessageBox.Show("Total Memory Usage = " + GC.GetTotalMemory(true).ToString());
}
private void button1_Click(object sender, EventArgs e)
{
bool exists = memCache.Get("a") != null;
MessageBox.Show("Value exits -> " + exists);
}
}
要使用代码,请点击 Button2 进行初始化,然后更改数据库中 Table2 的数据。使用 Button3 查看可用内存。
最佳答案
大概过了好久才回答。
public override object Remove(string key, string regionName = null);
您应该在插入/替换缓存数据之前删除旧 key 。
关于.net 4 MemoryCache 泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9905128/
我读了MSDN documentation但并没有真正理解它。 我相信Set的行为是“替换现有的,或添加”(原子地)。 正确吗? 最佳答案 如果该键已存在值, Add 不会执行任何操作(返回 fals
我试图找到一种方法让 .net 4.0 MemoryCache.Default 实例使用不区分大小写的比较器。 那可能吗? var bob = new object(); MemoryCache.De
我试图弄清楚应该如何使用 MemoryCache 以避免出现内存不足异常。我来自 ASP.Net 背景,缓存管理它自己的内存使用,所以我希望 MemoryCache 会做同样的事情。正如我制作的波纹管
在 Controller 类中,我有 using Microsoft.Extensions.Caching.Memory; private IMemoryCache _cache; private r
Memcached API 有一个 Touch() 方法,它可以更新给定 key 的过期策略。如何使用 .Net ObjectCache 类最好地完成此任务? 我能看到的最好的办法是删除对象并重新添加
当使用 MemoryCache 时,可以设置 AbsoluteExpiration AbsoluteExpirationRelativeToNow 例子: cache.GetOrCreate(
根据 MSDN 文档 here : Do not create MemoryCache instances unless it is required. If you create cache ins
我需要添加缓存功能并找到了一个名为 MemoryCache 的新类。但是,我发现 MemoryCache 有点残缺(我需要区域功能)。除其他事项外,我需要添加类似 ClearAll(region) 的
在我的应用程序中,我使用 MemoryCache,但我不希望项目过期。因此,项目将使用默认策略插入到缓存中,而无需设置 AbsoulteExpiration 或 SlidingExpiration。
MemoryCache类公开了一个名为 .AddOrGetExisting 的方法这是一种线程安全的方法,如果存在则获取,如果不存在则添加。 如果缓存对象不存在,此方法返回 NULL。我想我理解它的值
MemoryCache 是否具有缓存固定数量项目的功能? 例如我们只对从数据库中缓存 2000 个项目感兴趣。在不断向缓存中添加项目的同时,如果超过指定的项目数,则可以删除最旧的项目。 如果不是,我们
我正在使用 .NET 4.0 MemoryCache应用程序中的类并试图限制最大缓存大小,但在我的测试中,缓存似乎并没有真正遵守限制。 我正在使用设置,according to MSDN ,应该限制缓
我将 MemoryCache 与 Sql 依赖项一起使用。我注意到当使用 MemoryCache.Set() 时,如果集合中的某个项目被覆盖,则会发生内存泄漏。考虑以下场景: key=A 的项被插入到
我一直在阅读有关从 .Net Framework 4.0 开始的新 MemoryCache 类的所有地方。根据我的阅读,您可以跨不同的 .Net 应用程序访问 MemoryCache。我正在尝试在 A
我收到这条消息: System.ObjectDisposedException: Cannot access a disposed object. A common cause of this err
应用程序需要加载数据并缓存一段时间。我希望如果应用程序的多个部分想要同时访问同一个缓存键,缓存应该足够智能,只加载一次数据并将该调用的结果返回给所有调用者。然而, MemoryCache 不是这样做的
MemoryCache 是一个线程安全类,根据 this文章。但我不明白它在特定情况下会如何表现。例如我有代码: static private MemoryCache _cache = MemoryC
我不明白在 .NET 4.0 的 System.Runtime.Caching.MemoryCache 中滑动过期应该如何工作。 根据文档,过期时间跨度是“在从缓存中逐出缓存条目之前必须访问缓存条目的
在 .NET 4 MemoryCache 中,有没有办法找到上次访问项目的时间?我确定它在内部被跟踪,因为 CacheItemPolicy 具有 SlidingExpiration 属性。但是我找不到
我正在使用 .NET 4.0 MemoryCache类,我想以线程安全的方式添加或替换缓存中的现有项,但我还想知道我是否替换了现有项或添加了新项。 据我所知,Set方法旨在原子地替换缓存中的项目(如果
我是一名优秀的程序员,十分优秀!