我需要使用鎖對象,但它已被另一個線程使用。我希望等待,而鎖定對象將是免費的,但不知道如何做到這一點。c#線程同步
我發現某事像:
if(Monitor.TryEnter(_lock)
{
try
{
// do work
}
finally
{
Monitor.Exit(_lock);
}
}
但我只是檢查並繼續下去,但我希望等到鎖定對象是免費的。
我需要使用鎖對象,但它已被另一個線程使用。我希望等待,而鎖定對象將是免費的,但不知道如何做到這一點。c#線程同步
我發現某事像:
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
}
事實上,那些代碼片段將產生相同的代碼。編譯器會將第二個代碼翻譯成第一個。然而,第二個是可取的,因爲它更具可讀性。
UPDATE:
鎖定屬於它是在所取得的線程這就是說,通過lock
語句的嵌套使用是可能的:
void MethodA()
{
lock(_lock)
{
// ...
MethodB();
}
}
void MethodB()
{
lock(_lock)
{
// ...
}
}
上面的代碼將不阻塞。
您可以使用Monitor.Enter
從文檔:
使用Enter獲取作爲 參數傳遞的對象上的監視器。如果另一個線程在對象上執行了回車但 尚未執行相應的退出,則當前線程將阻止 ,直到另一個線程釋放該對象。
我同意@Daniel Hilgarth,lock
語法是首選。
關於你的問題:
我要等待鎖定對象將是免費的,但不知道如何做到這一點。
作爲每MSDN description:
鎖確保而另一個線程處於代碼的關鍵部分一個線程不進入臨界區。 如果另一個線程嘗試輸入一個鎖定的代碼,它將等待(阻止),直到該對象被釋放。
即你已經做了你想要的代碼。
但問題是,鎖對象是由我在同一個線程使用,但從不同的線程調用。我希望等待鎖定免費。 Sorrey爲我的英語,我想盡力解釋我可以... – santBart
@ user898569:請嘗試再次解釋您的問題。我不明白你的評論。當你的線程已經擁有鎖定時,它不會阻止第二個電話。請參閱更新。 –