標籤:
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共用資料