c#线程同步

c#线程同步,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我需要使用lock对象,但它已被另一个线程使用。我希望在lock对象空闲时等待,但不知道如何执行此操作 我发现像这样的东西: if(Monitor.TryEnter(_lock) { try { // do work } finally { Monitor.Exit(_lock); } } 但我只是检查并继续,但我希望等到lock对象释放 使用以下选项之一: Monitor.Enter(_lock) try { // do work } finally {

我需要使用lock对象,但它已被另一个线程使用。我希望在lock对象空闲时等待,但不知道如何执行此操作

我发现像这样的东西:

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

}
但我只是检查并继续,但我希望等到lock对象释放

使用以下选项之一:

Monitor.Enter(_lock)

try
{
    // do work
}
finally
{
    Monitor.Exit(_lock);
}
或者-更优选地-锁关键字:

lock(_lock)
{
    // do work
}
事实上,这些代码片段将生成相同的代码。编译器将把第二个代码翻译成第一个代码。然而,第二个是首选的,因为它更具可读性

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

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

void MethodB()
{
    lock(_lock)
    {
        // ...
    }
}
上述代码不会阻塞。

您可以使用

从文档:

使用Enter获取作为输入传递的对象上的监视器 参数如果另一个线程对对象执行了Enter,但是 尚未执行相应的退出,当前线程将 阻止,直到另一个线程释放该对象


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

关于你的问题:

我希望在lock对象空闲时等待,但不知道如何执行此操作

根据:

锁确保一个线程不进入关键部分,而另一个线程处于代码的关键部分如果另一个线程试图输入锁定的代码,它将等待(阻止)对象释放。


i、 e.您所拥有的代码已经实现了您所希望的功能。

但问题是,lock对象由我所在的同一线程使用,但从不同的线程调用。我想等待锁释放。为了我的英语,我正在尽我所能解释…@user898569:请再解释一遍你的问题。我不明白你的评论。当线程已经拥有锁时,它不会在第二次调用时阻塞。请参阅更新。