c#线程同步

本文关键字:同步 线程 | 更新日期: 2023-09-27 18:06:35

我需要使用锁对象,但是它已经被另一个线程使用了。我希望等待,而锁对象将是自由的,但不知道如何做到这一点。

我发现了这样的东西:

if(Monitor.TryEnter(_lock)
{
try
{
    // do work
}
finally
{
    Monitor.Exit(_lock);
}
}

但是如果它只是检查和继续,但我希望等到锁对象是空闲的。

c#线程同步

使用

Monitor.Enter(_lock)
try
{
    // do work
}
finally
{
    Monitor.Exit(_lock);
}

或者-更理想的- lock关键字:

lock(_lock)
{
    // do work
}

实际上,这些代码片段将生成相同的代码。编译器将把第二段代码翻译成第一段代码。但是,首选第二种格式,因为它更具可读性。

更新:
该锁属于获得它的线程。这意味着可以嵌套地使用lock语句:

void MethodA()
{
    lock(_lock)
    {
        // ...
        MethodB();
    }
}
void MethodB()
{
    lock(_lock)
    {
        // ...
    }
}

以上代码不会阻塞

您可以使用Monitor。输入

从文档:

使用Enter获取作为对象传递的Monitor参数。如果另一个线程在对象but上执行了Enter尚未执行相应的退出,当前线程会吗阻塞,直到另一个线程释放该对象。

我同意@Daniel Hilgarth的观点,lock语法是首选。

关于你的问题:

我希望在锁对象空闲时等待,但不知道如何做到这一点。

根据MSDN描述:

lock确保当另一个线程处于临界区时,一个线程不会进入临界区。如果另一个线程试图进入一个锁定的代码,它将等待(阻塞)直到对象被释放。

。您的代码已经完成了您想要它完成的任务。