在鎖定語句中丟擲異常
以下程式碼將釋放鎖定。沒問題。在幕後鎖定宣告作為 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
只評估一次。