2

我试图让事情变得更简单。这是我的代码:

    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,因此适用于任何一个的答案都将受到欢迎。

4

2 回答 2

6

使用委托?

例如

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

     return false;
}
于 2008-10-04T10:31:55.510 回答
4

这与您的上一篇文章非常相似,我希望得到类似的答案。唯一显着的区别是,如果超时失败,您可能会从您的方法中返回“null” - 然后不会调用“Dispose()”,您可以轻松检查该值:

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

唯一真正的故障是您不一定要向“对象”(甚至“T where T : class”)添加扩展方法......

Jon Skeet过去曾研究过这一点——值得一看

于 2008-10-04T09:37:04.340 回答