最近,在維護之前老系統的時候,發現了這樣一個錯誤: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