ASP.NET-es web alkalmazásunkat bizonyos műveletek elvégzése előtt érdemes zárolnunk, hogy több egyidejű kérés következtében ne alakulhasson ki olyan helyzet, hogy változóink helytelen értéket kapnának.
Ennek kiküszöbölésére zárolhatjuk az alkalmazásunkat, majd elvégezhetjük a kritikus műveletet és végül feloldhatjuk a zárat.
Zárolást érdemes végezni, ha a Page osztály HttpApplicationState típus Application property-jében tárolt változókhoz kívánunk hozzáférni. Ha például egy számlálót helyezünk itt el, mely minden kérést számlál, akkor a számláló növeléséhez két lépésre lesz szükségünk:
- a számláló aktuális értékének kiolvasása
- az érték növelése eggyel és az új érték tárolása.
Ha pont e két lépés között történne egy másik kérés kiszolgálása, melyben ugyanez a funkció fut, akkor a mi folyamatunk felülírná a számláló értékét, mely már módosult a lekérdezés óta.
Ennek megakadályozására lett létrehozva a Lock, Unlock függvény páros, melynek használata egyszerű: a Lock meghívása után az adatokhoz más folyamat nem férhet hozzá az Unlock hívásáig.
private void Page_Load(object sender, System.EventArgs e)
{
Application.Lock();
try
{
i = (int)Application["counter"];
Application["counter"] = ++i;
}
catch
{
Application.Add("counter", 1);
i = 1;
}
Application.UnLock();
}