2011-08-24 117 views
2

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

我发现某事像:

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

} 

但我只是检查并继续下去,但我希望等到锁定对象是免费的。

回答

2

既可以使用这样的:

Monitor.Enter(_lock) 

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

或 - 更优选地 - 所述lock关键字:

lock(_lock) 
{ 
    // do work 
} 

事实上,那些代码片段将产生相同的代码。编译器会将第二个代码翻译成第一个。然而,第二个是可取的,因为它更具可读性。

UPDATE:
锁定属于它是在所取得的线程这就是说,通过lock语句的嵌套使用是可能的:

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

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

上面的代码将不阻塞。

+1

但问题是,锁对象是由我在同一个线程使用,但从不同的线程调用。我希望等待锁定免费。 Sorrey为我的英语,我想尽力解释我可以... – santBart

+0

@ user898569:请尝试再次解释您的问题。我不明白你的评论。当你的线程已经拥有锁定时,它不会阻止第二个电话。请参阅更新。 –

0

您可以使用Monitor.Enter

从文档:

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

0

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

关于你的问题:

我要等待锁定对象将是免费的,但不知道如何做到这一点。

作为每MSDN description

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

即你已经做了你想要的代码。