我已经实现了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
两次?
ReaderWriterLockSlim rw = GetLoadingLock(parameters);
rw = GetLoadingLock(parameters); // This line is probably redundant
如果您使用的是Dictionary<string,bool>
对于 itemsLoading
,您可以使用 HashSet<string>
相反。
关于c# - 如果 ReadWriteSlimlock 被持有,则执行其他操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2560924/