Monitor.TryEnter和lock()一起工作吗?

Fir*_*gon 5 c# multithreading locking thread-safety

我正在查看已创建的代码,它在一个方法调用中使用TryEnter并锁定其他方法.所以,像这样:

private readonly object xmppLock = new object();

void f1() 
{
    if (Monitor.TryEnter(xmppLock))
    {
        try
        {
            // Do stuff
        }
        finally
        {
            Monitor.Exit(xmppLock);
        }
    }
}

void f2()
{
    lock(xmppLock)
    {
        // Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

这个可以吗?

mqp*_*mqp 9

lock只是语法糖Monitor.Enter,所以是的,它会工作正常.

Visual Basic SyncLock和C#锁定语句使用Monitor.Enter获取锁定,Monitor.Exit使用它来释放它.使用语言语句的优点是锁或SyncLock块中的所有内容都包含在Try语句中.

(也就是说,锁定像Type对象这样公开的东西被认为是糟糕的形式.)


Jar*_*Par 5

是的,这两个结构将一起工作.C#lock关键字只是Monitor.EnterMonitor.TryEnter方法的一个薄包装.

注意:我绝对会避免使用Type实例作为要锁定的值.这样做非常脆弱,因为它使两个完全不相关的代码块很容易意外地锁定在同一个对象上.这可能导致死锁.


par*_*mar 2

锁将阻塞,直到资源可用

如果已经锁定,TryEnter将不会执行任何操作。

根据您的需要,您必须使用其中之一。

在你的情况下,f2()无论需要多长时间,你都会做任何事。f1()如果存在锁争用,将立即返回