2012-12-21 152 views
5

釋放鎖時,我收到SynchronizationLockException。SynchronizationLockException(對象同步方法從非同步代碼塊調用。)釋放鎖時

當然,我做的第一件事就是谷歌搜索這個問題。我發現了兩種主要的錯誤模式:

  1. 在與創建不同的線程上釋放互斥鎖。
  2. 將值類型用作Monitor的同步對象。或 修改監視器的加入和退出之間的同步對象。

問題是,這些模式都不符合我的情況。

我有一個非常簡單的同步場景:

public class MyClass : IDisposable 
{ 
    private readonly object _myLock = new object(); 

    internal void Func1() 
    { 
     lock (_myLock) 
     { 
      //Some code here 
     } 
    } 

    internal void Func2() 
    { 
     lock (_myLock) 
     { 
      //Some code here 
     } 
    } 

    public void Dispose() 
    { 
     lock (_myLock) 
     { 
      //Some code here 
     } // Here is where I get an exception 
    } 
} 

最後,我收到SynchronizationLockException在哪裏鎖被釋放的Dispose()線。

我的問題不是「我的代碼有什麼問題」或「我做錯了什麼」。基本上,我想知道如何(以及在​​什麼情況下)可能發生這種情況,.NET的鎖實現引發此異常。

謝謝。

+3

什麼是堆棧跟蹤? – SLaks

+0

由於非託管代碼造成的堆損壞總是可能的。在你的問題中沒有任何東西可以表明這很可能。 –

+0

對象同步方法是從一個非同步的代碼塊調用的。 在MyClass.Dispose() 在CleanupForm.OnBtnRemoveClick(對象發件人,EventArgs的) 在System.Windows.Forms.Control.OnClick(EventArgs的) 在System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) ...消息&m) 在System.Windows.Forms.ButtonBase.WndProc(消息&m) 在System.Windows.Forms.Button.WndProc at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam) – user1921819

回答

0

我曾經在List實例中調整其底層數組以適應新元素時,收到SynchronizationLockException。列表實例已被從三個不同的線程訪問,並有一個鎖丟失...

我會說:三重檢查你是否正在做線程同步正確的方式。

此外,以正確方式實施IDisposable模式(請參閱http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx)。也許終結者讓你頭疼。

相關問題