我可以将Monitor.PulseMonitor.Wait等效于ReaderWriterLockSlim吗?

我有一个类,其中封装了对基础队列的多线程访问。为了入队,我获得了一个保护底层队列(和其他几个对象)的锁,然后添加了该项目,并用Monitor.Pulse锁定了对象,以表示已将某些内容添加到队列中。

public void Enqueue(ITask task)
{
    lock (mutex)
    {
        underlying.Enqueue(task);
        Monitor.Pulse(mutex);
    }
}

在队列的另一端,我有一个后台线程,该线程在消息到达队列时不断对其进行处理。当队列中没有任何项目时,它将使用Monitor.Wait以避免不必要的轮询。 (我认为这是一个很好的设计,但是如果有任何火焰(在合理的范围内)可以帮助我学习其他方法,则欢迎使用。)
private void DequeueForProcessing(object state)
{
    while (true)
    {
        ITask task;
        lock (mutex)
        {
            while (underlying.Count == 0)
            {
                Monitor.Wait(mutex);
            }
            task = underlying.Dequeue();
        }
        Process(task);
    }
}

随着向该类添加更多操作(要求对受锁保护的基础进行只读访问),有人建议使用ReaderWriterLockSlim。我以前从未使用过该类,并且假定它可以提供一些性能上的好处,但我并不反对,但前提是我可以保留Pulse/Wait设计。

最佳答案

不,基本上。它经过优化以提供某些特定/常见的方案。如果您不在这些情况下,它将无法正常工作。如果您需要Pulse等,请改用Monitor

关于c# - ReaderWriterLockSlim和Pulse/Wait,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2691703/

10-09 05:13