c# - 关于获取锁的说明

标签 c# .net multithreading locking

我使用 C# 编写代码已经有一段时间了,但是这个锁定顺序对我来说没有任何意义。我对锁定的理解是,一旦通过 lock(object) 获得了锁定,代码就必须退出锁定范围才能解锁对象。

这让我想到了手头的问题。我删掉了下面恰好出现在我代码中的动画类中的代码。该方法的工作方式是将设置传递给方法并修改,然后传递给另一个重载方法。另一个重载方法会将所有信息传递给另一个线程,以某种方式处理并实际为对象设置动画。当动画完成时,另一个线程调用 OnComplete 方法。这实际上一切都完美,但我不明白为什么!

另一个线程能够调用 OnComplete,获取对象上的锁并向原始线程发出它应该继续的信号。由于对象被锁在另一个线程中,代码此时不应该卡住吗?

所以这不需要帮助修复我的代码,需要澄清它的工作原理。任何有助于理解的帮助都将不胜感激!

public void tween(string type, object to, JsDictionaryObject properties) {
    // Settings class that has a delegate field OnComplete.
    Tween.Settings settings = new Tween.Settings();
    object wait_object = new object();

    settings.OnComplete = () => {
        // Why are we able to obtain a lock when the wait_object already has a lock below?
        lock(wait_object) {
            // Let the waiting thread know it is ok to continue now.
            Monitor.Pulse(wait_object);
        }
    };

    // Send settings to other thread and start the animation.
    tween(type, null, to, settings);

    // Obtain a lock to ensure that the wait object is in synchronous code.
    lock(wait_object) {
        // Wait here if the script tells us to.  Time out with total duration time + one second to ensure that we actually DO progress.
        Monitor.Wait(wait_object, settings.Duration + 1000);
    }
}

最佳答案

如文件所示,Monitor.Wait 释放 调用它的监视器。因此,当您尝试在 OnComplete 中获取锁时,不会有另一个线程持有锁。

当监视器发出脉冲(或调用超时)时,它会在返回之前重新获取它。

来自文档:

Releases the lock on an object and blocks the current thread until it reacquires the lock.

关于c# - 关于获取锁的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8895932/

相关文章:

.net - 慢速并行。用于中断

java - Java ExecutorService死锁?

c# - 使用 linq 时,在 .ForEach() 之前调用 .Any() 有什么好处吗?

c# - 运行 C# clickonce 控制台应用程序

.net - 高潮 RA0000 : No types were registered

node.js - 在单独的线程 Node Js 中运行长时间运行的快速 API 进程

c# - 由于挂起的数据库调用而取消线程

c# - 使用 '+' 运算符的字符串连接

javascript - 操作日期时出现日期问题

.net - Winform->WPF MVVM 键绑定(bind)错误?