Web应用程序中的静态变量

时间:2011-03-07 11:58:45

标签: c# .net asp.net session static-members

我可以在我的网络应用程序中使用静态变量吗?什么是静态的替代品?当我在页面中使用静态变量并且多个用户使用该应用程序时,它会产生冲突数据(不正确的数据)。

使用静态成员的限制是什么?

静态成员是否在内存中共享?

2 个答案:

答案 0 :(得分:18)

考虑将共享变量存储在HttpApplication对象或Cache对象中。

但是,如果您尝试单独存储每个用户的值,则应将这些值存储在Session变量中。

Asp.Net中的静态变量在w3svc.exe进程的内存空间中共享,并且不是线程安全的。它们可以由应用程序的任何用户访问和修改。这可能导致不必要的修改,除非您在这些值的存储周围编写自己的锁机制。

您应该尝试以下语法:

Application["KEY"] = value;

存储共享的应用程序范围的数据和

Session["KEY"] = value;

以每个用户为基础存储数据

您可以使用WebCache对象在到期条件下将数据存储在Web服务器的内存中。该语法类似于:

Page.Cache.Insert("KEY", "VALUE", null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);

有关管理WebCache对象的语法的更多信息,请访问:

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx

答案 1 :(得分:3)

只是为了添加@Jeff Fritz所说的内容,IIS应用程序会创建一个AppDomain,在其中加载程序集。就像普通的Windows应用程序的规则一样,如果是

这样的类
public static class Something
{
    public static string SomeString { get; set; }
}

...然后只有一个Something.SomeString属性 per AppDomain。 W3SVC进程管理AppDomain,但不保证线程安全(因为AppDomain可以为多个请求提供服务)。如果您使用只读静态属性,它可能很好(例如读取配置值)。如果要创建在请求生命周期内发生变化的可变属性,最好使用其他问题中详述的存储机制之一。