如果持有ReadWriteSlimlock,请执行其他操作

时间:2010-04-01 14:06:30

标签: c# multithreading

我已经实现了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();
}

任何人都可以指导我朝着正确的方向发展。

由于

2 个答案:

答案 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(零),则此方法   检查锁定状态并返回   如果需要,立即假   状态不可用。