簡體   English   中英

如果按住ReadWriteSlimlock,則執行其他操作

[英]Do something else if ReadWriteSlimlock is held

我已經實現了ReaderWriterLockSlim,現在我不希望它在鎖上等待。 如果鎖住了,我想做其他事情。

我考慮過使用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();
}

任何人都可以用這個指導我正確的方向。

謝謝

您可以使用將超時作為參數的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分配兩次rw

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

如果您對itemsLoading使用Dictionary<string,bool>itemsLoading可以使用HashSet<string>代替。

你為什么不使用TryEnterWriteLock()與超時TimeSpan為0?

如果超時為0(零),則此方法檢查鎖定狀態,如果所需狀態不可用,則立即返回false。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM