由于 asp.net 执行路径,我被迫使用静态变量。我必须在母版页以及被调用的页面上有相同的变量。静态变量使得继承变量变得非常容易,因为它们保持静态。不幸的是,这些变量挂在内存中,因为应用程序实际上并没有“退出”。当我用完这些变量时,有没有办法销毁它们?我调查了
IDisposable
但它的实现并不...干净。当页面完成渲染时,有没有办法销毁变量?
由于 asp.net 执行路径,我被迫使用静态变量。我必须在母版页以及被调用的页面上有相同的变量。静态变量使得继承变量变得非常容易,因为它们保持静态。
您不会“被迫”使用静态字段来在母版页与其内容页之间共享数据。您可能也不希望:静态字段将在应用程序的所有用户的所有请求之间共享,这意味着它们需要是线程安全的,并且仅限于在所有用户之间共享的数据。
有许多技术可以在主页面和内容页面之间共享数据。例如,您可以使用HttpContext.Items
仅在单个请求期间存在的字典。
对于任何正在寻找“假装”静态变量的方法的人,您可以这样做:
public static Datatype data
{
get
{
return (Datatype)HttpContext.Current.Items["DATA"];
}
set
{
HttpContext.Current.Items["DATA"] = value;
}
}
据我了解,这没有必要解决“杀死静态”值,但它应该避免由静态变量引起的任何数据冲突。我让我的整个项目引用静态变量并更改它会创建比应该看到的更混乱的代码。这样,当调用从您的静态对象中获取“DATA”时,它不会抓取指向的任何内容,而是使用上下文列表,该列表在之后被杀死并且对您的会话来说是唯一的。
您可以将它们设置为null
. 如果您使用的是 ASP.Net WebForms,您可以在Page.Unload
事件处理程序中执行此操作。
您应该避免在母版页中使用静态属性并使用 Session[""] 变量,当用户结束会话时它们将被销毁。
在不了解您的设置并考虑未来的云环境的情况下,您可以有多个服务器来响应用户请求,并且您不知道同一台服务器是否会响应该用户的所有请求或负载均衡器的要求其他服务器继续,我会像现在一样,给你2个选项
在选项之前,在 Web 环境中,最好停止使用会话或静态变量(出于上述原因)
使用 cookie
为什么不使用 cookie 将值从一个地方传递到另一个地方,当使用时,只需将过期数据写回一年,cookie 就消失了!
使用 MemCached
我的应用程序和数据库之间总是有一个缓存层,它是保存值的最佳方式,不仅从数据库提供给所有用户,而且是在需要跨应用程序时保存变量的好方法。