A HttpApplicationState osztály képes arra, hogy tetszőleges adatokat tároljon, melyek alkalmazásunkra nézve globálisak. Így attól függetlenül, hogy alkalmazásunkhoz hány kérés érkezik egyidejűleg, vagyis hány szál fut a programunkból, ez a közös adattár mindig elérhető, így a programunk egyes szálai között akár adatokat is átadhatunk.
Mivel az elhelyezhető adattípus Object, így tulajdonképpen bármilyen adatot, objektumot tárolhatunk későbbi felhasználás céljára.
Az adatok tárolásához mindegyiknek kell adnunk egy nevet, mely egy tetszőleges sztring lehet. A tárolás egy olyan konténerbe történik, melyből vagy a megadott név alapján, vagy a sorszám alapján kereshetjük elő adatainkat.
Adat elhelyezésére a HttpApplicationState osztály Add függvénye szolgál. Itt első paraméterként a tárolandó objektumnak választott nevet kell megadnunk, majd ezt követően a tárolandó adatot. Mellékelt példában a TextBox1-be írt szöveget tároljuk el, melynek DataX nevet adunk, ahol az X egy nullától induló sorszám.
private void Button1_Click(object sender, System.EventArgs e)
{
Application.Add("Data"+Application.Count.ToString(), TextBox1.Text);
}
Hogy hány adat került már tárolásra, azt a Count property árulja el számunkra.
private void Page_Load(object sender, System.EventArgs e)
{
Label1.Text = "Count: " + Application.Count.ToString();
}
Mellékelt példában a WebForm2.aspx lapon listázzuk ki a már tárolt adatokat, illetve itt valósítjuk meg az adatok közötti törlés lehetőségét is.
A listázást úgy oldjuk meg, hogy egy ListBox-ba írjuk az összes eltárolt adatot. Tesszük ezt a lap megjelenítésekor a Load eseménynél.
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
ListBox1.Items.Clear();
A HttpApplicationState osztály AllKeys property-jén keresztül kapunk egy olyan tömböt, melynek minden eleme egy sztring. Ezek a sztringek az Add függvénynél használt nevek lesznek. Ha tehát végigmegyünk ezen a tömbön, akkor egyesével, név alapján lekérdezhetjük az adatokat.
foreach(string s in Application.AllKeys)
{
A HttpApplicationState osztály Item indexelőjén keresztül érhetjük el az adatokat. Itt két lehetőségünk is van: vagy a kívánt elem nevét adjuk meg, vagy pedig sorszámát, mely 0 és Count-1 közötti szám lehet.
ListBox1.Items.Add((string)Application[s]);
}
}
}
Ha arra lenne szükségünk, hogy egy adott sorszámú elemnek a nevét tudjuk meg, akkor a GetKey függvényt kell meghívnunk, paraméterként átadva a kérdéses sorszámot, visszatérési értékként megkapjuk a keresett nevet.
Egy adott elem értékét kiolvasni a Get függvénnyel is lehet. Itt paraméterként szintén a kívánt elem nevét kell megadni sztringként, vagy pedig annak sorszámát.
Az Item-en keresztül nem csak kiolvasható, hanem meg is változtatható egy-egy adat értéke.
Applicaiton[2] = ”new value”;
Természetesen a Get ellentéte is létezik. Ez a Set függvény, mellyel fenti értékadás épp úgy elvégezhető. Itt első paraméterként az adat nevét kell megadnunk, másodikként pedig értékét.
Application.Set(”Data3”, ”new value”);
Az adatok megváltoztatásánál problémát okozhat, hogy több egyidejű kérés esetén programunk másik szála is ugyanahhoz az adathoz próbál meg hozzáférni. Ezt a hibát kivédendő alkalmazzuk a Lock – UnLock függvény párost. A Lock hívása megakadályozza, hogy egy másik folyamat hozzáférjen az adatokhoz. Ez az akadály az UnLock hívásával hárul el, így e kettő között nyugodtan adhatunk új értéket.
Application.Lock();
Application["Data3"] = ”new value”;
Application.UnLock();
Egy-egy elemet törölni a RemoveAt függvénnyel lehet. Itt paraméterként a törlendő elem sorszámát kell megadni. Mellékelt példában a ListBox-ban kijelölt elemet törölhetjük a RemoveAt gomb lenyomásával.
private void Button1_Click(object sender, System.EventArgs e)
{
if (ListBox1.SelectedIndex>-1)
{
Application.RemoveAt(ListBox1.SelectedIndex);
Response.Redirect("WebForm2.aspx");
}
}
Ha nem sorszám alapján, hanem név alapján szeretnénk megtalálni és törölni egy adatot, akkor használjuk a Remove függvényt, melynek paraméterként a törlendő adat nevét kell átadnunk.
Ha az összes elemet egy lépésben szeretnénk törölni, akkor a RemoveAll függvény használatos. Adott még egy Clear függvény is, mely funkciójában ugyanezt a célt szolgálja.
private void Button2_Click(object sender, System.EventArgs e)
{
Application.RemoveAll();
Response.Redirect("WebForm2.aspx");
}
A mellékelt példa lefordítása után futtassuk azt, majd tároljunk el több adatot is. Ezután indítsunk el több példányban böngészőt és mindegyikkel címezzük meg a példánk második lapját (http://localhost/Page01/WebForm2.aspx). Látható lesz, hogy minden böngészőben megjelennek a tárolt adatok.