序列化对静态资源的访问(串行端口)

时间:2016-09-08 13:00:23

标签: c# multithreading design-patterns serial-port message-queue

我试图确定解决此问题的最佳方法我将排队消息排队到多个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”按顺序排队。

如果有人对任何替代实施有任何想法,我很乐意听到它们。

0 个答案:

没有答案