gpt4 book ai didi

c# - ASP.NET MVC 3/Razor - 奇怪的缓存问题

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:50 24 4
gpt4 key购买 nike

我正在使用 LinqToSql 查询从数据库中选择组列表并生成一个表。我编写了一个自定义类来缓存此查询的结果以获得更好的性能。问题是,每当我实现缓存类时,我都会从输出语句中得到奇怪的附加行为。

我的结果以格式输出

Test Group (1)

其中“测试组”是名称,(1) 是该组中的成员数。这是将计数附加到名称的代码(来自 View )

<td>@group.group_name (@group.num_total)</td>

当我从实时 linq 查询返回组中提取它时,一切都按预期工作。

但是,当我使用我的缓存类时,每次连续的页面加载都会将数字添加到组标题的末尾:

Test Group (1) (1) (1) (1) (1) (1)

只有在我使用缓存类(包含在下面)时才会发生这种情况。我已经研究过缓存类,但我没有理由明白为什么会发生这种情况。

我可以想出几个解决这个问题的方法,所以这不是一个问题,但我很好奇到底发生了什么。有任何想法吗?

缓存类:

public class Cache
{
public static int user_id {
get { return
Convert.ToInt32(
Membership.GetUser(
HttpContext.Current.User.Identity.Name
).ProviderUserKey
);
}
}

public static void GetGroups_InvalidateCache()
{
if (HttpContext.Current.Cache["GetGroups_" + user_id] != null)
HttpContext.Current.Cache.Remove("GetGroups_" + user_id);
}

public static ICollection<Groups> GetGroups()
{
if (HttpContext.Current.Cache["GetGroups_" + user_id] == null)
{
using(DBContext db = new DBContext())
{

var Groups = (from g in db.Groups
where g.user_id == user_id
select g).ToList();

HttpContext.Current.Cache.Insert(
"GetGroups_" + user_id,
Groups,
null,
DateTime.Now.AddMinutes(5),
TimeSpan.Zero
);
}
}
return HttpContext.Current.Cache["GetGroups_" + user_id]
as ICollection<Groups>;
}
}

更新:

我现在已经实现了 Adam Tuliper 和 Paul Tyng 的建议,即使用 using 子句调用数据上下文,以 ToList() 结束 linq 语句并使用 ICollection 而不是 IQueryable。问题仍然存在。

另一个有趣的观察结果:仅当我导航到另一个页面并返回时才会发生此问题。如果我简单地刷新页面,它不会发生(虽然我刷新时任何以前的数字添加仍然存在)

最佳答案

不要返回 IQueryable,而是尝试简单地使用 IEnumerable 并使用

using(DBContext db = new DBContext()){var Groups =                 (from g in db.Groups                 where g.user_id == user_id                 select g).ToList(); ...}

也像上面的语句一样处理你的上下文(使用 using 子句)

ToList() 强制“现在”执行 - 我认为您可能遇到延迟执行问题

关于c# - ASP.NET MVC 3/Razor - 奇怪的缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9364278/

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