Application共享数据
1、Application与Session的区别
- Application对象:实现程序级别的数据共享。
- Session对象:实现会话级别的数据共享。
当需要整个程序级别的共享信息时,可以使用Application对象。例如需要设计一个计数器来统计访问系统的所有人数,或者在程序开始和结束时记录时间等。都可以利用Application对象来实现。Application对象中的key是字符串,而值是object类型,也就是说,你可以存储任意类型的数据到Application的一个key中,类似于Hashtable,只不过取的时候要转换类型。
2、Application简介
应用程序状态Application派生自NameObjectCollectionBase,允许用户通过一个字符串的名字来保存或取得相应的对象。
Application对象是HttpApplicationState类的实例。它的生命周期起始于系统开始运行时,终止于系统关闭。因此在不使用的时候,要及时释放空间。
HttpApplicationState的定义如下:
public sealed class HttpApplicationState : NameObjectCollectionBase
对于应用程序状态管理对象来说,由于所有的请求都可能需要访问这个对象,为了解决并发访问的问题,同时还提供了线程的同步机制,通过锁来同步对于这个集合的访问。
- public void Lock()
- public void UnLock()
HttpApplicationState类使用的AllKeys和Count属性以及Add,Clear,Get,GetKey,Remove,RemoveAt、Set方法执行自动锁定和解锁。但是,如果需要对保存在全局应用程序状态中的数据进行连续多次的访问,通过显示的Lock进行加锁和UnLock进行解锁有助于提高访问效率。
来看下MSDN里Application提供的功能:
方法:
Add 将新的对象添加到 HttpApplicationState 集合中。
BaseAdd 将具有指定键和值的项添加到 NameObjectCollectionBase 实例中。 (继承自 NameObjectCollectionBase。)
BaseClear 移除 NameObjectCollectionBase 实例中的所有项。 (继承自 NameObjectCollectionBase。)
BaseGet 已重载。 BaseGetAllKeys 返回 String 数组,该数组包含 NameObjectCollectionBase 实例中的所有键。 (继承自 NameObjectCollectionBase。)
BaseGetAllValues 已重载。
BaseGetKey 获取 NameObjectCollectionBase 实例的指定索引处的项键。 (继承自 NameObjectCollectionBase。)
BaseHasKeys 获取一个值,通过该值指示 NameObjectCollectionBase 实例是否包含键不为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing) 的项。 (继承自 NameObjectCollectionBase。)
BaseRemove 移除 NameObjectCollectionBase 实例中具有指定键的项。 (继承自 NameObjectCollectionBase。)
BaseRemoveAt 移除 NameObjectCollectionBase 实例的指定索引处的项。 (继承自 NameObjectCollectionBase。)
BaseSet 已重载。
Clear 从 HttpApplicationState 集合中移除所有对象。
Get 已重载。 通过名称或索引获取 HttpApplicationState 对象。
GetEnumerator 返回循环访问 NameObjectCollectionBase 的枚举数。 (继承自 NameObjectCollectionBase。)
GetKey 通过索引获取 HttpApplicationState 对象名。
GetObjectData 实现 ISerializable 接口,并返回序列化 NameObjectCollectionBase 实例所需的数据。 (继承自 NameObjectCollectionBase。)
Lock 锁定对 HttpApplicationState 变量的访问以促进访问同步。 OnDeserialization 实现 ISerializable 接口,并在完成反序列化之后引发反序列化事件。 (继承自 NameObjectCollectionBase。)
Remove 从 HttpApplicationState 集合中移除命名对象。
RemoveAll 从 HttpApplicationState 集合中移除所有对象。
RemoveAt 按索引从集合中移除一个 HttpApplicationState 对象。
Set 更新 HttpApplicationState 集合中的对象值。
UnLock 取消锁定对 HttpApplicationState 变量的访问以促进访问同步。
属性:
AllKeys 获取 HttpApplicationState 集合中的访问键。
Contents 获取对 HttpApplicationState 对象的引用。
Count 获取 HttpApplicationState 集合中的对象数。 (重写 NameObjectCollectionBase..::.Count。)
IsReadOnly 获取或设置一个值,通过该值指示 NameObjectCollectionBase 实例是否为只读的。 (继承自 NameObjectCollectionBase。)
Item 已重载。 获取对 HttpApplicationState 集合中的对象的访问。重载该属性以允许通过名称或数字索引访问对象。
Keys 获取 NameObjectCollectionBase..::.KeysCollection 实例,该实例包含 NameObjectCollectionBase 实例中的所有键。 (继承自 NameObjectCollectionBase。)
StaticObjects 获取由 <object> 标记声明的所有对象,其中范围设置为 ASP.NET 应用程序中的“Application”。
3、Global.asax文件
Global.asax文件与Application对象有着紧密的联系,它的主要功能是:设置一些在程序级别上使用的变量以及实现Application对象的OnStart和OnEnd事件。
示例:Global.asax代码:
void Application_Start(object sender, EventArgs e)
{
Application.Add("one", "刘备");
Application.Add("two", "关羽");
Application.Add("three","张飞");
}
页面代码:

protected void Page_Load(object sender, EventArgs e)
{
string[] strArr = Application.AllKeys; //获取所有的key组成的字符串数组
foreach (string str in strArr)
{
Response.Write(str + " "); //输出 one two three
} HttpApplicationState HAS = Application.Contents; //获取全局对象的引用,这样可以不在Global.asax中,在其他页面中也可以处理全局对象。
HAS.Add("four","赵云"); //获取全局对象的引用,然后在添加多一个对象,同样添加到的是Application里面,能够在任何地方都能够访问。
int count = Application.Count;
Response.Write(count); //输出4 HAS添加多了个赵云 foreach (string key in Application.Keys)
{
Response.Write(key + " : " + Application[key] + " "); //输出 one : 刘备 two : 关羽 three : 张飞 four : 赵云
} Response.Write("<br/>"); Application.Add("fine","黄忠"); //添加一个对象
Application.RemoveAt(4); //按照索引号移除一个对象 //索引号从0开始
Application.Remove("four"); //按照 key移除一个对象
foreach (string key in Application.AllKeys)
{
Response.Write(Application.Get(key)); //输出 刘备关羽张飞 Get方法可以按字符串,索引号获取值
} Application.Set("one","诸葛亮"); //设置值
Response.Write(Application["one"]); //输出 诸葛亮,可以看到已经修改过来了 string strkey = Application.GetKey(1); //按照索引号,获取key名称
Response.Write(strkey); //输出 two
}

Application共享数据的更多相关文章
- iOS: 在iPhone和Apple Watch之间共享数据: App Groups
我们可以在iPhone和Apple Watch间通过app groups来共享数据.方法如下: 首先要在dev center添加一个新的 app group: 接下来创建一个新的single view ...
- #pragma data_seg 共享数据区(转)
原文地址:http://www.cnblogs.com/CBDoctor/archive/2013/01/26/2878201.html 1)#pragma data_seg()一般用于DLL中.也就 ...
- 详解 Qt 线程间共享数据(用信号槽方式)
使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享 ...
- 【转】asp.net中利用session对象传递、共享数据[session用法]
来自:http://blog.unvs.cn/archives/session-transfer-method.html 下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值 ...
- 在 App 扩展和主 App 间共享数据
tags: iOS 8,Swift,App Groups 随着 iOS 8 的发布,苹果为广大开发者很多新的 API,其中最突出显著的就非 App Extension 莫属了.这为开发者们又带来了很多 ...
- asp.net中利用session对象传递、共享数据[session用法]
下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值: 首先定义将一个文本值或单独一个值赋予session,如下: session[“name”]=textbox1.text ...
- Qt学习:线程间共享数据(使用信号槽传递数据,必须提前使用qRegisterMetaType来注册参数的类型)
Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据 ...
- Unity 3D Framework Designing(5)——ViewModel之间如何共享数据
对于客户端应用程序而言,单页应用程序(Single Page Application)是最常见的表现形式.有经验的开发人员往往会把一个View分解多个SubView.那么,如何在多个SubView之间 ...
- Unity应用架构设计(5)——ViewModel之间如何共享数据
对于客户端应用程序而言,单页应用程序(Single Page Application)是最常见的表现形式.有经验的开发人员往往会把一个View分解多个SubView.那么,如何在多个SubView之间 ...
随机推荐
- js中fn()和return fn()的区别
参考文章:http://www.jb51.net/article/87977.htm 这文章中没有讲明白,其实只要把文章里的代码加和不加return调试一下就知道是怎么回事了. var i = 0; ...
- 20145322 何志威《网络对抗》shellcode注入&Return-to-libc攻击深入
基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址. execstack - ...
- python2.7和python3.6共存,使用pip安装第三方库
因为一般情况下,window命令行运行pip,默认的情况是运行python3.6的pip,安装第三方库的路径也是python3.6,安装路径是: 如何运行在2.7环境下安装PIP呢?有网上的教程说需要 ...
- vue2.0中v-on绑定自定义事件
vue中父组件通过prop传递数据给子组件,而想要将子组件的数据传递给父组件,则可以通过自定义事件的绑定. 每个Vue实例都实现了[事件接口],即: 1.使用 $on(eventName) 监听事件 ...
- phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php)
phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php) 一.总结 一句话总结:把原生php的网站直接放到thinkphp5的public目录下可以解决以stem.aaaa. ...
- shell sort命令
用法:sort [选项]... [文件]...串联排序所有指定文件并将结果写到标准输出. 排序选项: -b, --ignore-leading-blanks 忽略前导的空白区域 -d, --dicti ...
- Android Studio 中删除项目和项目找回------ Project Structure的使用
删除项目 点击File——Project Structure 在Project Structure页面,选中要删除的项目,点击上面的减号图标. 我把两个一起删除了,再次打开时,啥也没有 如果想要把不要 ...
- 快速切题 sgu134.Centroid 树形dp
134. Centroid time limit per test: 0.25 sec. memory limit per test: 4096 KB You are given an undirec ...
- [批处理]批量提取MKV资源
最初是下了部没字幕的动漫,是720P MKV格式的,当时没注意,下完了以后才发现是没字幕的 后来去射手上找没有,百度了半天也没有 最后只能求救与已经下了这部动漫是MKV格式且是内挂字幕的人来帮忙 最后 ...
- JS代码执行机制
JS代码从编译到执行 我们写出一段JS代码,JS的引擎并不是按照我们书写的顺序从上到下顺序编译并且执行的,首先是按照自己的规则对我们的代码先进行编译,然后从上到下执行编译的代码. 在全局作用域中,JS ...