c# - Monitor.TryEnter 和 lock() 是否一起工作?

标签 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
    }
}

这样可以吗?

最佳答案

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

The Visual Basic SyncLock and C# lock statements use Monitor.Enter to take the lock and Monitor.Exit to release it. The advantage of using the language statements is that everything in the lock or SyncLock block is included in a Try statement.

(也就是说,锁定诸如 Type 对象之类的公共(public)对象被认为是一种糟糕的形式。)

关于c# - Monitor.TryEnter 和 lock() 是否一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8184975/

相关文章:

c# - 从定期异步请求创建可观察对象

c# - 将 Expression<T, string>> 转换为 Expression<T, bool>>

multithreading - 为什么 redis+socket.io 的性能比 socket.io 更好?

mysql - 如何在SQL Server中像MYSQL一样进行锁定

c# - 如何使用 HtmlAgilityPack 进行异步调用?

c# - 如何完全验证 X509 证书?

java - 如何在继续之前等待线程结束

multithreading - “free-threaded”和 “thread-safe”之间的区别

concurrency - 如何使用 ZooKeeper 实现 Chubby 风格的锁序列器?

java - 当相应的 Stream 关​​闭时,Java FileChannel 锁是否关闭,或者我是否必须显式关闭它们?