2010-04-01 3 views
2

Я внедрил ReaderWriterLockSlim, теперь я не хочу, чтобы он дождался блокировки. Я хочу сделать что-то еще, если замок заблокирован.Сделайте что-нибудь еще, если проведет ReadWriteSlimlock

Я рассматривал это isWriterLockHeld, но это не делает много смысла для меня, Так, если два потока приходят одновременно, и если оператор одновременно ввести один по-прежнему будет ждать в замке

вот мой код.

ReaderWriterLockSlim rw = GetLoadingLock(parameters); 
rw = GetLoadingLock(parameters); 
try 
{ 
    rw.EnterWriteLock(); 
    item = this.retrieveCacheItem(parameters.ToString(), false); 
    if (item != null) 
    { 
     parameters.DataCameFromCache = true; 

     // if the data was found in the cache, return it immediately 
     return item.data;        
    } 
    else 
    { 
     try 
     { 
      object loaditem = null; 
      itemsLoading[parameters.ToString()] = true; 
      loaditem = this.retrieveDataFromStore(parameters); 
      return loaditem; 
     } 
     finally { 
     itemsLoading.Remove(parameters.ToString()); 
     } 
    } 
} 
finally 
{ 
    rw.ExitWriteLock(); 
} 

Может кто-нибудь, пожалуйста, направит меня в правильном направлении.

Благодаря

ответ

4

Вы можете использовать перегрузку TryEnterWriteLock(), которая принимает таймаут в качестве параметра. Если вы пройдете его ноль, он немедленно вернется, если блокировка не может быть выполнена.

if(rw.TryEnterWriteLock(0)) 
{ 
    // do something with the lock held (don't forget to use a try/finally) 
} 
else 
{ 
    // do something if the lock fails 
} 

по другому вопросу, почему вы назначая rw дважды?

ReaderWriterLockSlim rw = GetLoadingLock(parameters); 
rw = GetLoadingLock(parameters); // This line is probably redundant 

Если вы с помощью Dictionary<string,bool> для itemsLoading, вы можете использовать вместо HashSet<string>.

2

Почему бы вам не использовать TryEnterWriteLock() с тайм-аут TimeSpan 0?

Если тайм-аут равен 0 (ноль), этот метод проверяет состояние блокировки и возвращает ложные немедленно, если требуемое состояние недоступно.

Смежные вопросы