C# 锁定框架3.5和4.0?

C# 锁定框架3.5和4.0?,c#,.net,multithreading,.net-4.0,locking,C#,.net,Multithreading,.net 4.0,Locking,,在这两个版本中,lock之间存在差异 Framework4在monitor enter期间增加了一个检查是否存在异常(如内存不足异常) 还有一个locktaked标志,指示是否应该释放锁(在finally子句中)或不释放锁(由于try子句中的代码失败) 差不多 bool lockTaken = false; try { Monitor.Enter (lockObj, ref lockTaken); ... } finally { if (lockTaken) Monitor.Exi

,在这两个版本中,
lock
之间存在差异

Framework4在monitor enter期间增加了一个检查是否存在异常(如内存不足异常)

还有一个
locktaked
标志,指示是否应该释放锁(在
finally
子句中)或不释放锁(由于
try
子句中的代码失败)

差不多

bool lockTaken = false;
try
{
   Monitor.Enter (lockObj, ref lockTaken);
   ...
}
finally { if (lockTaken) Monitor.Exit (lockObj); }
(非常类似于使用code(dispose…)的

但是通过relfector查看我看到了完全不同的东西:

[SecuritySafeCritical]
public static void Enter(object obj, ref bool lockTaken)
{
    if (lockTaken)
    {
        throw new ArgumentException(Environment.GetResourceString("Argument_MustBeFalse"), "lockTaken");
    }
    ReliableEnter(obj, ref lockTaken);
}
最后,试一试的模式在哪里


我错过了什么

您应该查看使用
lock
语句而不是查看框架代码的反编译方法。因此,如果您尝试反编译以下方法:

object syncRoot = new object();
void Foo()
{
  lock(syncRoot) {}
}
您将看到您的期望:

void Foo()
{
  bool lockTaken;
  try
  {
    Monitor.Enter(syncRoot, out lockTaken);
  }
  finally
  {
    if (lockTaken)
        Monitor.Exit(syncRoot);
  }
}

在第一个片段中,您看到的是方法调用,在第二个片段中,您看到的是方法调用的实现。@dtb这就是c#4.0如何翻译lock语句(编辑标题)。谢谢sergey。我不知道编译器可以发出比FW代码更多的代码。