.net 您如何简单地监视.尝试输入

bxfogqkk  于 2022-12-30  发布在  .NET
关注(0)|答案(2)|浏览(103)

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

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,所以适用于任何一种的答案都是受欢迎的。

c3frrgcw

c3frrgcw1#

使用代理人?
例如

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

     return false;
}
xytpbqjk

xytpbqjk2#

这与您的last post非常相似,我希望得到类似的答案,唯一显著的区别是,如果超时失败,您可能会从方法返回“null”,这样就不会调用“Dispose()”,您可以轻松地检查该值:

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

唯一真实的的问题是,您不一定要向“object”(甚至是“T where T:类”)...
Jon Skeet在过去已经考虑到了这一点-worth a look

相关问题