[英]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.