我试图确定解决此问题的最佳方法我将排队消息排队到多个COM端口。每条消息都被发送到与多个串行设备(Facade模式)接口的静态类的传输队列。每条消息都由在第一次建立的连接时启动的线程排队。
这些消息可以从串行设备请求数据,也可以只写入内部寄存器。无论哪种方式,处理的消息都需要中继回最初将消息提交到队列的调用者,IO操作的结果(为了处理传入的数据并更新UI)。
到目前为止,我尝试使用三种不同的模式,所有这些模式我都不确定最合适。
1。多个侦听器订阅了IO操作完成时触发的事件。
没有涉及队列。调用者只是直接在静态类上调用同步方法。
public void InstrumentCommandComplete(string aHwid, ResponseParameter aParameter, bool aConnState, object aResult)
{
OnInstrumentResponse?.Invoke(this, new InstrumentResponseArgs(aHwid, aParameter, aConnState, aResult));
}
每次IO操作完成时都会触发,并传递任何相关的接收数据。任何感兴趣的类只是订阅此事件并相应地处理任何跨线程操作。
我发现这种方法最容易实现,在我的例子中,它是最易读的。但是,由于串行管理类抽象了对多个设备的访问,因此需要多个lock()
对象来避免对一个端口的并发访问。
2。带回调的命令模式。
public interface ICommand
{
void Execute();
}
class ConnectCommand : ICommand
{
private readonly Func<bool, int> callback;
public ConnectCommand(Func<bool, int> aCallBack)
{
callback = aCallBack;
}
public void Execute()
{
callback(instrument.Connect());
}
}
在这种情况下,命令被提交到静态&#34; CommandManager&#34;中的队列中。并通过提供的回调代表顺序排队,处理和呼叫者。
这里的问题是回调方法比我的第一次尝试更复杂,因为接收的数据主要由简单的16位整数组成。
第3。带有回调的完成端口。
Providing Asynchronous Serial Port Communication
根据上述问题,我曾尝试实施完成端口。但是我发现我需要多个AutoResetEvents
来处理来自静态串行管理器类的许多回调。
我在这个方法上没有取得多大成功,并在开始重构后不久就放弃了,因为我需要许多信号变量来模拟对端口的同步调用。
我很难找到处理设备请求的最佳实现。在这一点上,似乎最合适:
a)为每个请求生成新的BackgroundWorkers或者......
b)将每个请求提交给ConcurrentQueue,其中每个请求都包含一个回调,并由“&#39; Manager”按顺序排队。
如果有人对任何替代实施有任何想法,我很乐意听到它们。