gpt4 book ai didi

c# - 关于获取锁的说明

转载 作者:行者123 更新时间:2023-12-03 21:50:30 25 4
gpt4 key购买 nike

我使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com