最近,在维护之前老系统的时候,发现了这样一个错误:Object synchronization method was called from an unsynchronized block of code.code
因为是老系统,代码是Framework 1.0的版本,距离如今都快10年了。不少之前的DLL源代码,都没法找到。只能根据抛出的异常信息,从网上查询资料。对象
调查后,发现这个问题是因为Monitor抛出的,最后反编译抛出异常的DLL,证明了这个猜想。get
MSDN上,在Monitor类介绍中,对本文开篇说起到的这个异常进行了特别的说明:Monitor对象的Enter 和Exit方法,传递的参数应该是引用类型,而不是值类型,若是传递是值类型,则就会抛出本文开头提到的问题。这是因为值类型的参数,在传到到Enter或Exit方法后,会进行装箱,可是两次的装箱操做是各自独立的,编译器认为,装箱后生成的两个变量 是 不相同的。编译器
MSDN地址:https://msdn.microsoft.com/en-us/library/hf5de04k(VS.71).aspxit
进一步能够理解为,Monitor对象的Enter 和Exit方法是成对出现的,若是先后两个方法传递的参数不一样则会报Object synchronization method was called from an unsynchronized block of code.的错误。诸如:在Enter传递参数后,在后续的代码中修改了参数,在调用Exit的时候 就会报错。io