2010-04-01 3 views
2

J'ai implémenté ReaderWriterLockSlim, maintenant je ne veux pas qu'il attende au verrou. Je veux faire autre chose si le verrou est maintenu.Faire autre chose si ReadWriteSlimlock est tenue

je considérais l'aide est isWriterLockHeld mais il ne fait sens pour moi, Comme si deux threads sont en même temps et entrer dans l'instruction if en même temps, on sera toujours en attente à l'écluse

voici mon code.

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(); 
} 

Quelqu'un peut-il s'il vous plaît me guider dans la bonne direction avec cela.

Merci

Répondre

4

Vous pouvez utiliser la surcharge TryEnterWriteLock() qui prend un délai d'attente en tant que paramètre. Si vous le passez à zéro, il revient immédiatement si le verrou n'a pas pu être pris.

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 
} 

Sur une autre question, pourquoi êtes-vous assignez rw deux fois?

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

Si vous utilisez un Dictionary<string,bool> pour itemsLoading, vous pouvez utiliser un HashSet<string> à la place.

2

Pourquoi utilisez-vous pas TryEnterWriteLock() avec un délai d'attente TimeSpan de 0?

Si timeout est 0 (zéro), ce procédé vérifie l'état de verrouillage et renvoie false immédiatement si l'état souhaité est indisponible.

Questions connexes