【发布时间】:2012-04-18 11:33:20
【问题描述】:
有人要求我编写一个方法,允许调用者通过串行端口向硬件设备发送命令字符串。发送命令后,该方法必须等待设备的响应,然后将其返回给调用者。
为了使事情复杂化,硬件设备会定期向 PC 发送未经请求的数据包(应用必须存储以进行报告的数据)。所以当我发送一个串口命令时,我可能会在收到命令响应之前收到一个或多个数据包。
其他注意事项:可能有多个客户端可能同时发送串行命令,因为此方法将构成 WCF 服务的基础。此外,该方法需要同步(原因我不会在这里介绍),因此排除了使用回调将响应返回给客户端。
关于“多个客户端”,我打算使用 BlockingCollection 来对传入的命令进行排队,并使用一个后台线程一次执行一个任务,从而避免串行端口争用。
但是我不确定如何处理传入的串行数据。我最初的想法是有另一个后台线程不断读取串行端口,存储数据分析包,但也寻找命令响应。当接收到一个时,线程会以某种方式将响应数据返回给最初发送串行命令的方法(从那时起它一直在等待 - 请记住我有一个规定,该方法是同步的)。
这是我不确定的最后一点 - 我怎样才能让我的方法等到后台线程收到命令的响应?以及如何将后台线程的响应传递给我的等待方法,以便它可以将其返回给调用者?我是线程新手,所以我是不是走错路了?
提前致谢
安迪
【问题讨论】:
-
不要“等待”返回。你在一个事件驱动的系统中。
-
来自设备的数据是否有某种请求 ID,以便您知道数据的用途?
-
en.wikipedia.org/wiki/Actor_model !正如@Henk 所说,让它变得更基础,大部分复杂性都消失了。
-
@Peter,是的,响应字符串中会有一些内容来识别它响应的是哪个命令。
-
@Henk,我同意让它基于事件会简化事情,回调可能是我的答案!不幸的是,WCF 服务将被非 .Net 客户端调用(例如通过 REST),所以这必须是同步的。虽然我可以以事件驱动的方式编写大部分功能,但它可能必须在 WCF 服务中的某个点收敛到同步方法。
标签: c# multithreading