Az esemény felhasználásához szükségünk lesz egy CacheItemRemovedCallback típusú változóra, mely az eseménykezelő függvény címét tárolja majd.
private static CacheItemRemovedCallback Removed = null;
A konstruktorban kap értéket e változó.
public WebForm1()
{
Page.Init += new System.EventHandler(Page_Init);
Itt kerül megadásra a RemovedCache nevű belső függvényünk, mely akkor kerül majd meghívásra, amikor a Cache törölte az adatunkat.
Removed = new CacheItemRemovedCallback(RemovedCache);
}
A Page_Init eseménykezelő függvényben helyezzük el először a Cache-re az adatot. Így mire alkalmazásunk elindul, a szükséges adat a Cache-ből már elérhető lesz.
private void Page_Init(object sender, EventArgs e)
{
InitializeComponent();
Az adat elhelyezésére a Cache objektum Add függvényét használjuk. Itt első paraméterben adjuk meg a tárolandó objektumunk nevét. A második paraméter lesz a tárolandó adat, melyet most egy belső függvényünk készít el. A harmadik paraméterben egy függőséget írhatnánk elő, melyre mostani példánkhoz nincs szükség, de múlt heti cikkünkben már foglalkoztunk a CacheDependency osztállyal.
A negyedik vagy az ötödik paraméter lesz az, mely az adat élettartamát befolyásolja. A kettő közül csak az egyiket használhatjuk, mivel ez két különböző módot jelent, melyeknek együtt nem lenne értelme.
Ha a negyedik paraméterben megadunk egy konkrét, fix időpontot, akkor ezzel azt érjük el, hogy az adott időpontban a Cache törli az adatot minden esetben. Alábbi példánál e konkrét időt úgy adjuk meg, hogy az aktuális időhöz 10 másodpercet hozzáadunk. Ebben az esetben tehát 10 másodperc múlva mindenképpen törölve lesz a Cache-ből az adat. Ezt ki is próbálhatjuk: futtassuk a programot és folyamatosan kattintsunk a frissítés gombra. Látható lesz, hogy a web oldalon megjelenő időpont – melyet a Cache-en tárolt adatból veszünk – csak 10 másodpercenként frissül.
Cache.Add("StringData", RetriveCacheData(), null, DateTime.Now.AddSeconds(10), Cache.NoSlidingExpiration, CacheItemPriority.High, Removed);
Ebben az esetben az ötödik paraméternél a Cache osztály NoSlidingExpiration mezőjének értéket kell megadnunk.
A másik lehetőség a következő: a negyedik paramétert nem használjuk, ekkor itt a Cache osztály NoAbsoluteExpiration mezőjének értékét kell használnunk, míg az ötödik paraméterben egy TimeSpan osztályban tárolt időpontot adhatunk meg. Ebben az esetben a következő történik, ha az itt megadott időtartam két webes kérés között eltelik, akkor kerül törlésre a Cache-ben tárolt adat. Alábbi példában egy 10 másodperces időt adtunk meg a TimeSpan osztályban. Ha tehát két kérés között több mint 10 másodperc telik el, akkor lesz törölve a cache-ről az adatunk. Ezt ki is próbálhatjuk: a mellékelt példában a Cache.Add függvény hívásban írjuk át a paramétereket az alábbiakra, valamint ugyanezt tegyük a RemovedCache függvényünkben is, és futtassuk a programot. Ha a frissítés gombra kattintunk 10 másodpercen belül, akkor mindig ugyanazt az adatot látjuk, ha a két frissítés között várunk 10 másodpercet, akkor a Cache törölni fogja az adatot és így az frissül.
Cache.Add("StringData", RetriveCacheData(), null, DateTime.Now.AddSeconds(10), Cache.NoSlidingExpiration, CacheItemPriority.High, Removed);
Bármelyik esetet is használjuk a két fenti közül, fontos, hogy az Add függvény utolsó paraméterében megadjuk a CacheItemRemovedCallback típusú változóban tárolt függvényünket, melyet a Cache-nek meg kell hívnia akkor, ha törölte adatunkat.
Ebben az esetben az adatunkat újra kell generálni és elhelyezni ismét a Cache-ben.
Ehhez ugyanazt a módszert használjuk, mint a fentiekben.
public void RemovedCache(string k, object v, CacheItemRemovedReason r)
{
Cache.Add("StringData", RetriveCacheData(), null, DateTime.Now.AddSeconds(10), Cache.NoSlidingExpiration, CacheItemPriority.High, Removed);
}
A RetriveCacheData függvényünk lesz az, mely előállítja a szükséges adatot a Cache-ben való tároláshoz. Az egyszerűség kedvéért ez most az aktuális dátum és időpont lesz sztringgé alakítva.
public string RetriveCacheData()
{
return DateTime.Now.ToString("T");
}
A web oldal betöltődésekor a Page_Load eseménykezelőben olvassuk ki a Cache-en elhelyezett adatot és annak tartalmát megjelenítjük egy Label kontrol segítségével.
private void Page_Load(object sender, System.EventArgs e)
{
string s = (string)Cache["StringData"];
Label1.Text = s;
}