PDA

View Full Version : Asp.net Cache thread safe



golagha_program
یک شنبه 04 مرداد 1388, 20:50 عصر
سلام خدمت دوستان.
موضوعی که می خوام راجع به اون صحبت کنم multi thread و thread safe در کشینگ.
خوب اول از همه خود کش کاملاً thread safe پیاده سازی شده ولی اگر قرار باشه اعمال مختلفی روش پیاده سازی بشه باید مثل sql transaction روش قفل بذارید.
من این کلاس رو نوشتم که اجازه می ده تعداد زیادی کاربر بدون دخالت هم بخونن و فقط یک کاربر بنویسه و موقع بروز رسانی اونی که داره می خوانه قفل رو در دسترس بگیره.
لطفاً نظر بدید .



public class SynchronizedCache
{
private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();

public Cache Cache
{
get { return HttpContext.Current.Cache; }
}

public object Read(string key)
{
cacheLock.EnterReadLock();
try
{
return Cache.Get(key);
}
finally
{
cacheLock.ExitReadLock();
}
}

public object ReadWithOutLock(string key)
{
return Cache.Get(key);
}

public void Add(string key, object value)
{
cacheLock.EnterWriteLock();
try
{
Cache.Insert(key, value);
}
finally
{
cacheLock.ExitWriteLock();
}
}

public void AddWithOutLock(string key, object value)
{
Cache.Remove(key);
Cache.Insert(key, value);
}

public bool AddWithTimeout(string key, object value, int timeout)
{
if (cacheLock.TryEnterWriteLock(timeout))
{
try
{
Cache.Insert(key, value);
}
finally
{
cacheLock.ExitWriteLock();
}
return true;
}
else
{
return false;
}
}


public AddOrUpdateStatus AddOrUpdate(string key, object value)
{
cacheLock.EnterUpgradeableReadLock();
try
{
if (value==Cache.Get(key))
{
return AddOrUpdateStatus.Unchanged;
}
else
{
cacheLock.EnterWriteLock();
try
{
Delete(key);
Cache.Insert(key, value);
}
finally
{
cacheLock.ExitWriteLock();
}
return AddOrUpdateStatus.Updated;
}
}
finally
{
cacheLock.ExitUpgradeableReadLock();
}
}


public void Delete(string key)
{
cacheLock.EnterWriteLock();
try
{
Cache.Remove(key);
}
finally
{
cacheLock.ExitWriteLock();
}
}

public void DeletePrefix(string prefix)
{
prefix = prefix.ToLower();
List<string> itemsToRemove = new List<string>();

IDictionaryEnumerator enumerator = Cache.GetEnumerator();
while (enumerator.MoveNext())
{
if (enumerator.Key.ToString().ToLower().StartsWith(pr efix))
itemsToRemove.Add(enumerator.Key.ToString());
}

foreach (string itemToRemove in itemsToRemove)
Cache.Remove(itemToRemove);
}

public enum AddOrUpdateStatus
{
Added,
Updated,
Unchanged
}

}

golagha_program
دوشنبه 05 مرداد 1388, 15:15 عصر
مرسي از نظراتون.