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