我试图实现一个通用的线程安全的Cache方法,我想知道我应该如何实现它的锁.
它应该看起来像这样:
- //private static readonly lockObject = new Object();
- public T GetCache<T>(string key,Func<T> valueFactory...)
- {
- // try to pull from cache here
- lock (lockObject) // I don't want to use static object lock here because then every time a lock is performed,all cached objects in my site have to wait,regarding of the cache key.
- {
- // cache was empty before we got the lock,check again inside the lock
- // cache is still empty,so retreive the value here
- // store the value in the cache here
- }
- // return the cached value here
- }
有什么建议么?
谢谢,
阿米尔.
解决方法
这是您使用
mutex的情况
- public T GetCache<T>(string key,Func<T> valueFactory...)
- {
- // note here that I use the key as the name of the mutex
- // also here you need to check that the key have no invalid charater
- // to used as mutex name.
- var mut = new Mutex(true,key);
- try
- {
- // Wait until it is safe to enter.
- mut.WaitOne();
- // here you create your cache
- }
- finally
- {
- // Release the Mutex.
- mut.ReleaseMutex();
- }
- }