2011-11-18 82 views
5

我正在查看已創建的代碼,它在一個方法調用中使用TryEnter,並在其他方法中鎖定。所以,像這樣:Monitor.TryEnter和lock()一起工作嗎?

private readonly object xmppLock = new object(); 

void f1() 
{ 
    if (Monitor.TryEnter(xmppLock)) 
    { 
     try 
     { 
      // Do stuff 
     } 
     finally 
     { 
      Monitor.Exit(xmppLock); 
     } 
    } 
} 

void f2() 
{ 
    lock(xmppLock) 
    { 
     // Do stuff 
    } 
} 

這樣好嗎?

回答

2

鎖將阻塞,直到資源可用

TryEnter,如果它已經被鎖定不會做任何事情。

根據您的需要,您必須使用其中一種。

在你的情況下,f2()將永遠做它永遠做的事,無論它需要多長時間。 f1()將立即返回,如果有鎖爭用

+0

這並沒有回答這個問題,也就是** mix **'lock'和'Monitor.TryEnter'是否可以與同一個對象一起使用。 [查看對此類似問題的答案](https://stackoverflow.com/q/14377366/199364) – ToolmakerSteve

8

lock只是語法糖爲Monitor.Enter,所以是的,它會正常工作。

The Visual Basic SyncLock and C# lock statements use Monitor.Enter to take the lock and Monitor.Exit to release it. The advantage of using the language statements is that everything in the lock or SyncLock block is included in a Try statement.

(這就是說,它被認爲是一種欠佳鎖定在一些公共像Type對象。)

+0

這不會回答** OP使用的TryEnter ** –

+0

很明顯,使用'TryEnter'獲取一個鎖在一個地方會一起工作,在另一個地方使用「Enter」來獲取它,所以它不值得一提。 – mquander

4

是這兩個結構將一起工作。 C#lock關鍵字僅僅是Monitor.EnterMonitor.TryEnter方法的薄包裝。

注意:我絕對避免使用Type實例作爲鎖定值。這樣做非常脆弱,因爲它非常容易讓兩個完全不相關的代碼意外鎖定在同一個對象上。這可能導致死鎖。

+0

感謝關於typeof()的指針。我曾就此問過一個不同的問題,因爲我不明白它在做什麼,因爲它不是我正在編輯的代碼,我想確保知道發生了什麼。 – Firedragon