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