繁体   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