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代码更多的代码。