C#在锁语句中引发异常

示例

以下代码将解除锁定。不会有问题的。幕后锁语句的作用是try finally

lock(locker)
{
    throw new Exception();
}

在C#5.0规范中可以看到更多信息:

lock形式的声明

lock (x) ...

wherex是引用类型的表达式,恰好等于

bool __lockWasTaken = false;
try {
    System.Threading.Monitor.Enter(x, ref __lockWasTaken);
    ...
}
finally {
    if (__lockWasTaken) System.Threading.Monitor.Exit(x);
}

除了那只x被评估一次。