埃里克·利珀特(Eric Lippert)在他的博客中谈到了这一点: 锁和异常不会混在一起
等效代码在C#4.0和早期版本之间有所不同。
在C#4.0中,它是:
bool lockWasTaken = false;var temp = obj;try{ Monitor.Enter(temp, ref lockWasTaken); { body }}finally{ if (lockWasTaken) Monitor.Exit(temp);}Monitor.Enter采取锁定时,它依赖于自动设置标志。
之前是:
var temp = obj;Monitor.Enter(temp);try{ body}finally{ Monitor.Exit(temp);}这不依赖于
Monitor.Enter和之间抛出异常
try。我认为在调试代码中违反了这种情况,因为编译器在它们之间插入了NOP,从而使两者之间的线程中止成为可能。



