c# - 寻找一种允许一个编写器并拒绝其他编写器的框架类

标签 c# .net multithreading concurrency

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

这是我正在寻找的内容:

  • 一个作家可以进入“锁”
  • 如果拥有“锁”,则可以多一个写入者在队列中等待
  • 更多的编写器只是返回或收到一个异常,表明该操作当前不可能

.NET框架中是否存在这样的类?

我想要实现的目标:传入触发器的频率非常高。在每个触发器上,我想保存状态信息(要点 1)。数据不太重要,所以我不太关心某些元素丢失(要点 3)。

但是,我想确保捕获至少一个在保存数据时触发的状态,因为它可能包含重要的更改。这构成了要点 2。我知道不能保证我能够捕获该状态更改,因为它可能已来回更改多次。这是可以接受的。至少我想尝试...

最佳答案

由于您只需要编写器,最简单的解决方案是使用 semaphore 。如果您还需要允许读者,那么您就会陷入困境。

基本方法可能如下所示:

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

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

关于c# - 寻找一种允许一个编写器并拒绝其他编写器的框架类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39505496/

相关文章:

c# - ServiceStack.Redis 的GetNextSequence 调用放入redis 数据库的是什么?

c# - 命名、声明和定义委托(delegate)和事件约定

java - 当 Java 线程设置为 null 时会发生什么?

python - Python Tornado中的已连接客户端列表

java - CPU 进程可以决定应用程序的速度潜力

c# - 如何访问用户控件页面 ListView 中动态创建的表的文本框?

c# - SELECT 语句中的 Linq 静态方法

c# - 有没有办法列出 .Net 程序集中方法的所有调用和硬编码字符串参数?

c# - 什么是 .exp 文件和 .lib 文件,我如何在我的 C# 项目中使用它们?

.net - 监视 Azure WebJob 的 CPU 和内存