我知道 ReaderWriterLock
和 ReaderWriterLockSlim
类,我正在寻找类似的东西,我希望已经有一个 .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/