【发布时间】:2015-11-18 15:16:25
【问题描述】:
我正在使用使用 RS-232(串行)通信的静电计。它一次接受一个命令,并返回一个响应,指示该命令是否成功完成。
为了演示,只考虑以下方法...
private void SetDevice()
{
sc.SetBias();
sc.SetRange();
sc.SetCollectionTime();
sc.SetID();
}
sc.SetID() 的方法签名如下。
public void SetID()
{
ComPort.Write("*IDN?");
}
以上内容让您了解其他单独的命令调用是什么样的。
由于DataReceived Event 表明它是在辅助线程上引发的,我应该如何继续等待每个命令调用之间的响应?目前在sc.SetBias() 被称为sc.SetRange() 之后触发,而不考虑上一个命令是否成功执行。
我可以理解,通过在新线程中启动 DataReceivedEvent 可以防止我的 UI 锁定,但在这种情况下,当响应与适当的命令调用配对至关重要时,我不确定最好的可用选项,并希望在我的研究中得到一些指导。到目前为止,我正在考虑获取当前 UI 线程的句柄并使用Thread.Sleep(sleepTime),但不知道静电计的响应时间到底有多可靠,这真的是最佳实践吗?并且不需要在发送每个命令后调用它吗?
【问题讨论】:
-
为什么不在第二个线程上排队?制作一个通用接口,您可以将呼叫推送到队列中。然后,队列管理器可以负责确保不会同时发生两个调用。抱歉,我不熟悉静电计。我强烈建议不要使用 thread.sleep,如果这是在任何类型的负载下,您将花费更多时间进行上下文切换而不是实际计算。
-
不要使用DataReceived,它对你一点帮助都没有。只需在调用 Write() 后直接读取响应,通常使用 ReadLine()。您需要 ReadTimeout 属性以避免挂起。
标签: c# multithreading serial-port thread-safety threadpool