【发布时间】:2015-06-26 17:03:26
【问题描述】:
我正在开发一个 C# 4.5 应用程序,其中许多线程需要访问同一个串行端口。
由于我也将在串行端口上接收响应,因此我想避免进一步写入,直到我收到响应并阅读它。
我有一个 SerialHandler 类,它是 SerialPort 类的包装器,写入和读取方法如下所示:
public void write(string message)
{
Monitor.Enter(lockingObject);
//Stuff
serialPort.write(message);
}
public string read()
{
//Reading procedure
Monitor.Exit(lockingObject);
}
但是,一旦我从表单发出写入消息,我就会收到 SynchronizationLockException,说“对象同步方法是从未同步的代码块中调用的”。 lockObject 是一个私有且只读的 Object 变量。
我怎样才能避免这个错误? 非常感谢
编辑,它应该像这样工作:
线程 A 获得读/写访问权限
线程 B 尝试访问但失败
线程 A 开始读取,因此他释放了他的锁
线程 B 现在可以执行写入、获取锁、读取和移除锁
【问题讨论】:
-
为什么直接用monitor代替lock?
-
因为我需要在一个方法中锁定访问并在另一个方法中释放它
-
异常说你在调用 write() 之前调用了 read()。这是一个错误。
标签: c# multithreading serial-port synchronization thread-safety