2011-08-24 166 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

鎖確保而另一個線程處於代碼的關鍵部分一個線程不進入臨界區。 如果另一個線程嘗試輸入一個鎖定的代碼,它將等待(阻止),直到該對象被釋放。

即你已經做了你想要的代碼。