c# - 如果 ReadWriteSlimlock 被持有,则执行其他操作

标签 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();
}

任何人都可以指导我正确的方向吗?

谢谢

最佳答案

您可以使用 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/

相关文章:

c# - 使用 MVVMCross 的属性条件绑定(bind)

c++ - 接收输入时运行后台循环 (C++)

python - 何时使用线程以及使用多少线程

java - 文本在 fragment 内更改后,Android 调用一次函数

C++0x 错误 : variable 'std::packaged_task<int> pt1' has initializer but incomplete type

c# - 跨线程控制

C# 将字节数组转换为泛型列表

c# - 负载平衡器环境中的替代SignalR Redis实现

c# - 将 HTML 字符串添加到 OpenXML (*.docx) 文档

c# - 在多线程应用程序中跟踪任务号