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