我正在就分配给我的一个项目寻求建议,我希望了解它是如何“专业”完成的,或者任何可以引导我走向正确方向的建议。
我有一个服务器部件,它接受来自客户端的命令并将字节流推送到串行端口。尽管多个客户端可以向该服务器发送命令,但我们的硬件一次只能处理一个命令。我的问题是在软件端排队。
我实现了一个 Queue
帮助程序类,该类还将数据插入到 DataSet 中,其中包含:请求客户端编号、消息数据(写入串行端口的字节数组)和消息类型(命令描述) 。它还将在 DataGrid(表单上)中列出队列命令。可能不是可行的方法,但就保留请求客户端和数据并以视觉方式显示队列而言,这是我能想到的唯一方法。
我在哪里处理队列的处理?我考虑过在自定义事件中处理它,如果 DataGrid 列表发生更改(添加/删除项目),则获取 DataSet 中的第一行数据并将其发送到串行端口。
如有任何意见或建议,我们将不胜感激。
谢谢。
编辑:我忘记补充一点,它确实需要来自串行端口的响应,以便将当前执行的命令从队列中删除。
I am seeking advice on a project I have been assigned and I'm looking to see how it's done "professionally," or any suggestions that can lead me to the right direction.
I have a server piece that accepts commands from clients and pushes out byte streams to a serial port. Although multiple clients can send commands to this server piece, our hardware only can handle one command at a time. My problem is with queueing in the software end.
I've implemented a Queue<T>
helper class that also inserts data into a DataSet containing: the requesting client number, message data (byte array to write to serial port) and message type (command description). It will also list the queue commands in a DataGrid (on the Form). Probably not the way to go, but that's the only thing I can think of as far as retaining the requesting client and the data and showing, visually, the queue.
Where do I handle the processing of the queue? I thought about handling it on a custom event where if the DataGrid list changed (item added/removed), grab the first row of data in the DataSet and send it out to the serial port.
Any comments or suggestions are greatly appreciated.
Thanks.
Edit: I forgot to add that it does require a response from the SerialPort as well, in order for the current executed command to be removed from the queue.
发布评论
评论(3)
我将使用数据库表来存储命令队列。 Web 应用程序会将记录添加到队列并显示队列,然后单独的进程(例如 Windows 服务或控制台应用程序)将从数据库请求下一个命令并将其发送到串行端口。
I would use a database table to store the queue of commands. The web app would add records to the queue and display the queue, then a separate process (such as a Windows service or console app) would request the next command from the database and send it to the serial port.
客户端请求可以随时传入,它们可能会由某个代理类(WCF?)在其自己的线程/任务上处理。然后,该线程/任务需要与实际处理请求的模型“内部”的任务进行协调。
BlockingCollection 是一个很好的类。
服务器线程将阻塞,直到集合中有东西可以处理。然后它可以以线程安全的方式从集合中取出它并进行处理。这样做可以确保请求到达时可以被接受,但它们会被一次性处理。
这里要考虑的总体模式是生产者-消费者。
国杰
Client requests can come in at any time, they'll probably be handled by some proxy class (WCF?) on its own thread/task. Then that thread/ task needs to coordinate with the task that's 'inside' the model actually processing the requests.
A good class to do this with is the BlockingCollection.
The server-thread will block until there's something in the collection to work on. It can then take it from the collection in a thread safe manner and process it. Doing it this way ensures that the requests can be accepted when they arrive, but they are processed on at a time.
The overall pattern to think of here is producer-consumer.
GJ
如果它是高交易量 Web 应用程序,您可能需要查看排队系统,例如 MSMQ,Service Broker 队列 或 RabbitMQ。然后,窗口服务可以拾取排队的项目并将其发送到串行端口。
If it is a high trasaction web application you might want to look at queueing system such as MSMQ, Service Broker Queue or RabbitMQ. Window service can then pick up the queued items and send it to serial port.