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
        }

时间: 2024-10-07 00:23:11

Application共享数据的相关文章

iOS应用程序间共享数据(转)

我们知道iOS由于沙盒的存在,应用程序不能越过自己的区域去访问别的存储空间的内容,不过可能有许多场景我们需要在应用程序之间共享数据,比如多个应用共用用户名密码进行登录等.虽然我们不能直接通过文件系统来分享数据,不过还是有些方法可以实现,为了方便说明,这里同时创建了两个工程Example1和Example2,实现这两个app之间的信息共享,Example1负责写数据,Example2负责读数据,具体的demo代码可以到这里获取 UIPasteboard 剪贴板是应用程序之间传递数据的简单方式,建议

Android - SharedPreferences共享数据的相同Context

SharedPreferences共享数据的相同Context 本文地址: http://blog.csdn.net/caroline_wendy 使用SharedPreferences,可以存储和共享数据,需要使用相同的Context和TAG. 在设置(put)数据的部分,提供public的TAG:在查询(get)数据的部分,使用该class的TAG: 设置: public static final String TAG; SharedPreferences prefs = Preferenc

在 App 扩展和主 App 间共享数据

tags: iOS 8,Swift,App Groups 随着 iOS 8 的发布,苹果为广大开发者很多新的 API,其中最突出显著的就非 App Extension 莫属了.这为开发者们又带来了很多机会. 而我们在开发 App Extension 的时候,基本大多数人都会遇到这样一个问题.就是由于 App Store 的规则是 App Extension 不能独立的发布,而是要跟随一个宿主应用一起发布. 比如奇妙清单: {% img figures /images/extension_1.jp

ContentProvider共享数据的使用

当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据. 文件的操作模式,通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样可以对外共享数据,但数据的访问方式会因数据存储的方式而不同. 采用xml文件对外共享数据,需要进行xml解析来读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据.

详解 Qt 线程间共享数据(用信号槽方式)

使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据从一个线程传递到另外一个线程. 第一种办法在各个编程语言都使用普遍,而第二种方式倒是QT的特有方式,下面主要学习一

ContentProvider共享数据

  1.ContentProvider 一般服务端设置共享数据, 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据.而使用ContentProvider共享数据的好处是统一了数据访问方式. 当应用需

asp.net中利用session对象传递、共享数据[session用法]

下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值: 首先定义将一个文本值或单独一个值赋予session,如下: session["name"]=textbox1.text:将文本1的值赋给了session变量name,当调查到其它页面时,此值可以传递,依然存在,下面是调用或判断此值. If(session["name"]==null) {} Else { lable1.text=session["name"].tos

详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)

使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享数据主要有两种方式: 使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的: 使用singal/slot机制,把数据从一个线程传递到另外一个线程. 第一种办法在各个编程语言都使用普遍,而第二种方式倒是QT的特有方式,下面主要学习一

【转】asp.net中利用session对象传递、共享数据[session用法]

来自:http://blog.unvs.cn/archives/session-transfer-method.html 下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值: 首先定义将一个文本值或单独一个值赋予session,如下: session["name"]=textbox1.text:将文本1的值赋给了session变量name,当调查到其它页面时,此值可以传递,依然存在,下面是调用或判断此值. If(session["name"