Application共享資料

weixin_34262482發表於2013-02-07

 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
        }

 

相關文章