我需要使用lock对象,但它已经被另一个线程使用了。我希望等待锁定对象是免费的,但不知道如何做到这一点。
我发现......好像:
if(Monitor.TryEnter(_lock)
{
try
{
// do work
}
finally
{
Monitor.Exit(_lock);
}
}
但我只是检查并继续,但我希望等到锁定对象空闲。
答案 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
语法是首选。
关于你的问题:
我希望等待锁定对象免费但不知道如何执行此操作。
lock确保一个线程不进入临界区,而另一个线程位于代码的关键部分。 如果另一个线程试图输入锁定的代码,它将等待(阻止)直到该对象被释放。
即。你已经完成了你想要的代码。