【问题标题】:C# Advice about queueingC# 关于排队的建议
【发布时间】:2011-03-22 18:28:43
【问题描述】:

我正在就分配给我的一个项目寻求建议,并希望了解它是如何“专业地”完成的,或者任何可以引导我走向正确方向的建议。

我有一个服务器部件,它接受来自客户端的命令并将字节流推送到串行端口。尽管多个客户端可以向该服务器发送命令,但我们的硬件一次只能处理一个命令。我的问题是在软件端排队。

我已经实现了一个Queue<T> 帮助器类,它还将数据插入到一个DataSet 中,其中包含:请求的客户端编号、消息数据(要写入串行端口的字节数组)和消息类型(命令描述)。它还将列出 DataGrid(在窗体上)中的队列命令。可能不是要走的路,但这是我唯一能想到的保留请求客户端和数据并在视觉上显示队列的方法。

我在哪里处理队列?我考虑在自定义事件上处理它,如果 DataGrid 列表发生更改(添加/删除项目),则获取 DataSet 中的第一行数据并将其发送到串行端口。

非常感谢任何 cmets 或建议。

谢谢。

编辑:我忘了补充说它确实需要来自 SerialPort 的响应,以便从队列中删除当前执行的命令。

【问题讨论】:

  • 如果您接受来自客户端的数据,您肯定不想从服务器的数据网格中修改/输入它吗?响应一个新的数据网格项目听起来不是一个糟糕的起点
  • 你为什么要实现 Queue 类?它已经为你准备好了。
  • @Jon Cage:我只是使用 DataGrid 来显示队列列表(谁的命令是下一个)。
  • @user177883:我实现了一个帮助器类,当我将一个项目排入队列时,它还将来自客户端的数据插入到数据集中。

标签: c# queue fifo task-queue


【解决方案1】:

我会使用数据库表来存储命令队列。 Web 应用程序将记录添加到队列并显示队列,然后一个单独的进程(例如 Windows 服务或控制台应用程序)将从数据库请求下一个命令并将其发送到串行端口。

【讨论】:

    【解决方案2】:

    客户端请求可以随时进入,它们可能会由某个代理类(WCF?)在其自己的线程/任务上处理。然后,该线程/任务需要与模型“内部”实际处理请求的任务协调。

    一个很好的类是BlockingCollection

    服务器线程将阻塞,直到集合中有东西可以处理。然后它可以以线程安全的方式从集合中获取它并处理它。这样做可以确保请求在到达时可以被接受,但它们是一次处理的。

    这里要考虑的总体模式是生产者-消费者。

    GJ

    【讨论】:

      【解决方案3】:

      如果它是一个高交易量的 Web 应用程序,您可能需要查看队列系统,例如 MSMQService Broker QueueRabbitMQ。窗口服务然后可以拿起排队的项目并将其发送到串行端口。

      【讨论】:

        猜你喜欢
        • 2011-04-30
        • 1970-01-01
        • 2010-10-02
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多