C#对同一锁的两种方法进行不同的处理

C#对同一锁的两种方法进行不同的处理,c#,locking,mutex,readerwriterlockslim,C#,Locking,Mutex,Readerwriterlockslim,我有一个包含两个方法的类(一个实例): 允许多个线程同时访问它。 但是,如果调用了Connect,则不允许任何线程进入DoSomething,反之亦然,因此Connect和DoSomething是互斥的。 调用DoSomething的频率高于Connect 我的第一个想法是使用readerwriterlocksim,但是,当DomeSomething获取读卡器锁并且需要调用Connect本身时,它无法在Connect中获取写入器锁 什么样的同步模式最适合实现此目标?您要使用的锁支持升级为写锁,因

我有一个包含两个方法的类(一个实例):

允许多个线程同时访问它。 但是,如果调用了
Connect
,则不允许任何线程进入
DoSomething
,反之亦然,因此
Connect
DoSomething
是互斥的。 调用
DoSomething
的频率高于
Connect

我的第一个想法是使用
readerwriterlocksim
,但是,当
DomeSomething
获取读卡器锁并且需要调用
Connect
本身时,它无法在
Connect
中获取写入器锁


什么样的同步模式最适合实现此目标?

您要使用的锁支持升级为写锁,因此您可以使用它。输入写锁会引发LockRecursionException:“当前线程已进入读取模式,并且尚未拥有写锁,因此,尝试在写入模式下进入锁可能会造成死锁。“如果我使用
UpgradableReadLock
而不是
ReadLock
多线程无法进入,您是否使用了EnterUpgradableReadLock?”?
EnterUpgradeableReadLock
的文档状态为:“在任何给定时间,只有一个线程可以进入可升级模式。”因此,这不能替代读锁。使用
EnterUpgradeableReadLock
将阻止多个线程同时访问
DoSomething
。您不能要求
Connect
DoSomething
相互排斥,然后期望从另一个线程调用一个线程。你想达到什么目标?
public class Example
{
    public void Connect()
    {
        // do stuff
    }

    public void DoSomething()
    {
        if (someCondition)
            Connect();

        // do stuff
    }
}