寻找一个允许一个写入器而拒绝其他写入器的框架类

本文关键字:拒绝 其他 框架 一个 许一个 寻找 | 更新日期: 2023-09-27 18:07:01

我知道ReaderWriterLockReaderWriterLockSlim类,我正在寻找类似的东西,我希望已经有一个。net框架类,所以我不需要自己实现。

这是我要找的:

  • 一个写入器可以输入"lock"
  • 如果"锁"被拥有,可以在队列中多等待一个写器
  • 任何更多的写入器返回或获得一个异常,操作当前不可能

在。net框架中存在这样的类吗?

我想要实现的:有一个非常高的速率传入触发器。在每个触发器上,我都想保存状态信息(第1点)。数据不是太重要,所以我真的不关心某些项是否丢失(第3点)。

但是,我希望确保捕获在保存数据时触发的至少一个状态,因为它可能包含重要的更改。这就是要点2。我知道我不能保证能够捕捉到状态的变化,因为它可能被来回更改多次。这是可以接受的。

寻找一个允许一个写入器而拒绝其他写入器的框架类

因为您只需要写入器,所以最简单的解决方案是使用信号量。如果你还需要允许读者,你就有点麻烦了。

基本的方法可能是这样的:

SemaphoreSlim _writerSemaphore = new SemaphoreSlim(2);
readonly object _actionLock = new object();
public bool TryExecute()
{
  bool acquired = false;
  try
  {
    acquired = _writerSemaphore.Wait(0);
    if (!acquired) return false;
    lock (_actionLock)
    {
      // Your action
    }
    return true;
  }
  finally
  {
    if (acquired) _writerSemaphore.Release();
  }
}

如果您还需要阅读器,最简单的解决方案是确保队列在ReaderWriterLock 之前:

SemaphoreSlim _writerSemaphore = new SemaphoreSlim(2);
ReaderWriterLockSlim _readerWriterLock = new ReaderWriterLockSlim();
public bool TryExecuteWriter(Action action)
{
  bool acquired = false;
  try
  {
    acquired = _writerSemaphore.Wait(0);
    if (!acquired) return false;
    _readerWriterLock.EnterWriteLock();
    try
    {
      action();
      return true;
    }
    finally
    {
      _readerWriterLock.ExitWriteLock();
    }
  }
  finally
  {
    if (acquired) _writerSemaphore.Release();
  }
}

这将确保在任何时候,最多有两个线程等待进入写锁。为了保证正确性,请注意在释放写器锁和释放信号量之间存在一个轻微的竞争条件——然而,考虑到您的约束,这应该不是一个问题。