我正在開發一個C#4.5應用程序,其中許多線程將需要訪問相同的串行端口。C#Monitor.Enter SynchronizationLockException
因爲我也會在串口上接收響應,所以我想避免進一步寫入,直到我收到響應並讀取它。
我有一個SerialHandler類是SerialPort類的包裝,寫入和讀取方法看起來是這樣的:
public void write(string message)
{
Monitor.Enter(lockingObject);
//Stuff
serialPort.write(message);
}
public string read()
{
//Reading procedure
Monitor.Exit(lockingObject);
}
但只要我發出了從形式寫我得到的SynchronizationLockException說「對象同步方法是從一個非同步的代碼塊調用的」。 lockingObject是一個私有的只讀對象變量。
我該如何避免此錯誤? 非常感謝
編輯,就應該像這樣工作:
線程A獲得訪問讀/寫
線程B試圖訪問,但未能
線程A獲得讀那麼他釋放了鎖
線程B現在可以執行寫操作,得到他的鎖,讀取和刪除他鎖
爲什麼使用顯示器,而不是直接的鎖? – willaien
因爲我需要在一個方法中鎖定訪問並在另一個方法中釋放它 –
這個異常說你在調用write()之前調用了read()*。這是一個錯誤。 –