c#线程同步

时间:2011-08-24 10:30:42

标签: c# multithreading thread-safety

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

我发现......好像:

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

}

但我只是检查并继续,但我希望等到锁定对象空闲。

3 个答案:

答案 0 :(得分:2)

要么使用它:

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)
    {
        // ...
    }
}

以上代码不会阻止。

答案 1 :(得分:0)

您可以使用Monitor.Enter

来自docs:

  

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

答案 2 :(得分:0)

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

关于你的问题:

  

我希望等待锁定对象免费但不知道如何执行此操作。

根据MSDN description

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

即。你已经完成了你想要的代码。