【问题标题】:How would you simply Monitor.TryEnter您将如何简单地 Monitor.TryEnter
【发布时间】:2008-10-04 09:34:18
【问题描述】:

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

    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,因此欢迎任何适用于其中的答案。

【问题讨论】:

    标签: c# .net vb.net parallel-processing


    【解决方案1】:

    使用委托?

    例如

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

    【讨论】:

    • 对 VB 完全没用(没有匿名的 Action 委托),但我可以看到它与 C# 一起工作。你能说明你如何预见它会被调用吗?
    • 最简单的方法是使用 lambda:TryEnter(obj, ()=>{...code...})),返回值会告诉您它是否已完成。
    • 现在 VB 10 有匿名委托,这是我最喜欢的解决方案。
    【解决方案2】:

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

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

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

    Jon Skeet 过去看过这个 - worth a look

    【讨论】:

    • 将可能的 null 传递给 using 块是一个巧妙的技巧。但我仍然觉得它很笨拙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多