在锁定语句中抛出异常
以下代码将释放锁定。没问题。在幕后锁定声明作为 try finally
工作
lock(locker)
{
throw new Exception();
}
在 C#5.0 规范中可以看到更多 :
形式的 lock
声明
lock (x) ...
其中 x
是一个引用类型的表达式,恰好相当于
bool __lockWasTaken = false;
try {
System.Threading.Monitor.Enter(x, ref __lockWasTaken);
...
}
finally {
if (__lockWasTaken) System.Threading.Monitor.Exit(x);
}
除了 x
只评估一次。