c#线程同步
本文关键字:同步 线程 | 更新日期: 2023-09-27 18:06:35
我需要使用锁对象,但是它已经被另一个线程使用了。我希望等待,而锁对象将是自由的,但不知道如何做到这一点。
我发现了这样的东西:
if(Monitor.TryEnter(_lock)
{
try
{
// do work
}
finally
{
Monitor.Exit(_lock);
}
}
但是如果它只是检查和继续,但我希望等到锁对象是空闲的。
使用
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确保当另一个线程处于临界区时,一个线程不会进入临界区。如果另一个线程试图进入一个锁定的代码,它将等待(阻塞)直到对象被释放。
。您的代码已经完成了您想要它完成的任务。