2008-10-04 29 views
2

我試圖讓事情變得更簡單。這裏是我的代碼:你會如何簡單Monitor.TryEnter

If Threading.Monitor.TryEnter(syncRoot) Then 
     Try 
      'do something 
     Finally 
      Threading.Monitor.Exit(syncRoot) 
     End Try 
    Else 
     'do something else 
    End If 

這比ReaderWriterLock在噪聲方面還要差。 我可以使用C#或VB,所以應用於任何一個的答案都會受到歡迎。

回答

6

使用委託?

E.g.

public bool TryEnter(object lockObject, Action work) 
{ 
    if (Monitor.TryEnter(lockObject)) 
    { 
     try 
     { 
      work(); 
     } 
     finally 
     { 
      Monitor.Exit(lockObject); 
     }   
     return true; 
    } 

    return false; 
} 
4

這與您的last post非常相似,我期望得到類似的答案。唯一顯著的區別是,如果超時失敗,你可能會返回「空」從你的方法 - 那麼「的Dispose()」不叫,你可以很容易地檢查該值:

using(var token = GetLock(syncLock, timeout)) { 
    if(token != null) { ... } 
} 

唯一真正的故障是你不一定要添加一個擴展方法到「對象」(或者甚至「T where T:class」)...

Jon Skeet已經看過去了 - worth a look

+0

將一個可能的null傳遞給using塊是一個巧妙的技巧。但它對我仍然感覺很糟糕。 – 2008-10-04 09:50:02

+0

(注意我編輯過,以使超時在調用中可見) – 2008-10-04 10:04:50