2010-04-01 36 views
2

我已經實現了ReaderWriterLockSlim,現在我不希望它在鎖中等待。如果持有鎖,我想做其他事情。如果執行ReadWriteSlimlock,則執行其他操作

我認爲使用是isWriterLockHeld,但它並沒有使太大的意義對我來說,因爲如果兩個線程在同一時間進來,if語句在同一時間進入一個將仍處於鎖定

等待這是我的代碼。

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()一個超時的0 TimeSpan

如果超時是0(零),則此方法 檢查鎖狀態,並返回 立即假如果期望 狀態是不可用的。

相關問題