我已经实现了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();
}
任何人都可以指导我朝着正确的方向发展。
由于
答案 0 :(得分:3)
您可以使用以超时作为参数的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>
代替。
答案 1 :(得分:2)
为什么不使用TryEnterWriteLock()
的超时TimeSpan
为0?
如果超时为0(零),则此方法 检查锁定状态并返回 如果需要,立即假 状态不可用。