该
lock语句由C#3.0转换为以下内容:
var temp = obj;Monitor.Enter(temp);try{ // body}finally{ Monitor.Exit(temp);}在C#4.0中,此更改已更改,现在生成如下:
bool lockWasTaken = false;var temp = obj;try{ Monitor.Enter(temp, ref lockWasTaken); // body}finally{ if (lockWasTaken) { Monitor.Exit(temp); }}你可以找到什么更多信息
Monitor.Enter确实在这里。引用MSDN:
使用
Enter以获取作为参数传递的对象上的监视器。如果另一个线程Enter
在对象上执行,但尚未执行Exit,则当前线程将阻塞,直到另一个线程释放对象。同一线程在Enter不阻塞的情况下多次调用是合法的
。但是,Exit必须等待相等数量的 调用,然后等待该对象的其他线程才能解除阻塞。
该
Monitor.Enter方法将无限期等待;它 不会 超时。



