ASP.NET 记忆(担心静态变量和会话)
本文关键字:变量 会话 静态 担心 NET 记忆 ASP | 更新日期: 2023-09-27 18:34:44
我开始在我的 ASP.NET 应用程序中使用记忆的实现,它是这样的(我认为非常简单(:
public static class Memoizer
{
public static Func<A, B, R> Memoize<A, B, R>(this Func<A, B, R> f)
{
var map = new Dictionary<Tuple<A, B>, R>();
return (a, b) =>
{
var tuple = new { a, b };
R value;
if (map.TryGetValue(tuple, out value))
return value;
value = f(a, b);
map.Add(tuple, value);
return value;
};
}
}
对于"普通"应用程序,一切都没问题,我已经对其进行了测试,但现在我想修改此代码以在 ASP.NET 应用程序中使用。
我想知道的问题是我需要将 map 对象保存在 Session 变量中,因为我不希望不同的用户混淆值/函数调用。
现在,如果我记住两个不同的函数,使用此代码我会生成两个不同的静态变量,这没关系,但是如果我将它们保存到会话中,我必须区分它们以获得某些标识符(函数名称?(,否则它们将在会话中共享相同的映射对象。
我有点不解,我不知道我是否错过了什么...
安德里亚
您显示的代码本身是完全线程安全的。如果您按预期使用它并创建一个不与其他线程共享的函数,那么这不是问题。
如果你将函数从一个请求保留到下一个请求,那么你实际上并没有使用它来记忆,而是在使用它来缓存。
使用记忆进行缓存是很糟糕的。记忆函数永远不会忘记任何东西,因此应用程序运行的时间越长,函数 keps 的地图就越多。最终它无法再增长,因为它无法分配更多内存,并且应用程序将崩溃。
如果要缓存结果,则应改用适当的缓存,缓存可能会丢弃长时间未使用的结果,或者当其他内容需要内存时。
不能在会话中保存记忆函数。
您需要将每个函数保存在某个应用程序范围的存储中:
private static Dictionary<TUser,Fumc<A,B,R>> memoizedfunctions = new Dictionary<TUser,Fumc<A,B,R>>();
其中 TUser 是允许您区分用户的某种类型(例如登录名(。
顺便说一下,每个用户都可以有多个发起的会话,你真的希望他们有单独的功能吗?
您可以存储地图,而不是记忆功能,但想法是一样的,您需要以某种方式将数据与请求相关联。