在锁定语句中抛出异常
以下代码将释放锁定。没问题。在幕后锁定声明作为 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 只评估一次。