应用程序状态是一个能够被 ASP.NET 应用程序中的所有类都可用的数据贮存室。应用程序状态被存储在服务器的内存中并且速度要比从数据库中存储并获取信息时要来得更快。与会话状态不同,会话状态只指定了单独的用户会话,而应用程序状态会作用于所有的用户和会话。因此,应用程序状态在存放少量经常被使用并且不会在用户之间被更改的数据存储的时候是比较适用的。
应用程序状态被存储在 HttpApplicationState 类中,在用户第一次访问应用程序中的 URL 资源的时候,一个新的 HttpApplicationState 类的实例将会被创建。HttpApplicationState 类通过 Application 属性被暴露。
应用程序状态把数据当成 Object 类型进行存储。因此,你必须在获取数据的时候把它们转换成适当的类型。
因为应用程序状态被存储在服务器上的内存中,所以在应用程序状态中存储庞大的数据会迅速地淤积到服务器的内存中。如果应用程序被重启,应用程序状态就会被丢失。应用程序无法在 Web 农场的多个服务器之间或者在 Web 花园的工作者进程之间被共享,最后,应用程序状态是基于自由线程的,因此任何被存储在应用程序状态中的数据都必须提供内建的同步支持。更多关于这些考虑事项的信息,请参考:[ASP.NET 应用程序状态]和[ASP.NET 状态管理的建议]。
在应用程序状态中写入值
在你的应用程序中,为 HttpApplicationState 类中的变量设置值。
如下所示的代码范例说明了应该如何把应用程序变量 Message 设置成一个字符串。
Application["Message"] = "Welcome to the Contoso site.";
在应用程序启动的时候把值写入到应用程序状态中。
在应用程序 Global.asax 文件的 Application_Start 事件处理器中,设置应用程序状态变量的值。与常规的 .aspx 页面一样,HttpApplicationState 类同样是通过 Application 对象被暴露的。
如下所示的代码范例说明了你应该如何把应用程序变量 Message 设置成一个字符串并且把变量 PageRequestCount 初始化成 0。
Application["Message"] = "Welcome to the Contoso site."; Application["PageRequestCount"] = 0;
把值写入到被锁定的应用程序状态中
应用程序状态变量能够同时被多个线程访问。因此,要防止出现无效的数据,你必须对应用程序状态进行锁定,从而只允许只被一个线程进行写入。
提示:除非你已经设置了一些其他类型的锁定,否则你应该始终在一个锁定语句中更改应用程序状态数据。关于更多信息,请参考:[多线程数据同步]。
把值写入到被锁定的应用程序状态中
在你设置应用程序变量的代码中,调用 System.Web.HttpApplicationState.Lock 方法,设置应用程序状态值,然后调用 System.Web.HttpApplicationState.UnLock 方法来解锁应用程序状态,释放它以服务于其他写入请求。
如下所示的代码范例说明了你应该如何锁定并解锁应用程序状态。代码把变量 PageRequestCount 的值加 1 然后解锁应用程序状态。
Application.Lock(); Application["PageRequestCount"] = ((int)Application["PageRequestCount"])+1; Application.UnLock();