5

我目前正在研究模拟连接对象之间的资源和消息传输的方法,例如设备的电源或网络系统上的控制消息:

在此处输入图像描述 点击查看大图。

我最近一直在研究 TPL 数据流,不是因为它的线程和并行性,而是因为它可以在不处理大量杂乱代码的边缘情况下实现数据流水线的效果。模拟可能每 500 毫秒左右只运行一次,并且实际上不是时间关键的。

我一直在玩图书馆,并且已经阅读了文档,现在已经阅读了几次,但我正在努力实现它的解决方案。在上图中的节点概念中,我不确定什么适合 Dataflow 节点。

我很想就 TPL Dataflow 是否适合这里得到一些建议,如果适合的话,是 Dataflow Block 对应部分中每个图示节点的基本实现。

4

2 回答 2

5

我认为 TPL Dataflow 不太适合这一点。有几个原因:

  1. TDF 没有双工(双向)通信,您需要以某种方式将其固定。
  2. 在 TDF 中,块通常接收消息,然后生成更多消息以沿管道发送。这似乎不是您需要的(集线器节点除外),至少在逻辑上不是。

但我认为您的要求不需要像 TDF 这样重量级的东西。我认为你应该做的是:

  1. 创建一个简单的消息发送库,可能使用类似客户端-服务器的架构:客户端(例如消费者节点或分发节点)向服务器(例如分发节点或电源节点)发送消息,服务器回复,可能带有一些延迟。如果客户端连接到多个服务器,它会向所有服务器发送相同的消息并决定如何处理多个响应(可能只接受第一个响应;这也意味着客户端必须能够拒绝响应)。
  2. 创建一个PowerStore存储能量并可以用来获取能量的类。它将返回 a Task,因此消费者可以等到电源可用。
  3. 使用以上两点,构建节点应该相对简单。
于 2013-04-07T16:22:29.557 回答
2

经过深思熟虑、原型设计和研究,我终于使用事件和代表实现了该解决方案,并且运行良好!

唯一的主要设计问题是,例如,如果 3 个分发节点连接成三角形,则消息将进入无限循环的情况。或者如果一个节点连接到自身或两个节点多次相互连接。我在事件侦听器连接中用一些简单的逻辑覆盖了这些边缘案例中的每一个:

public bool ConnectTo(Node peerNode)
        {
            EthernetPort peerPort   = peerNode.GetFreePort();
            EthernetPort myPort     = this.GetFreePort();

            // Perform a check for free ports for both peers:
            if (peerPort == null || myPort == null)
                return false; // Either myself or my peer do not have a spare port.

            // Perform a check to make sure these nodes aren't already connected:
            if (this.HasConnectedNode(peerNode))
                return false;

            // Connect the two ports:
            myPort.Connect(peerNode, peerPort);
            peerPort.Connect(this, myPort);
            return true;
        }
public bool HasConnectedNode(Node node) {
            foreach (var port in ethernetSwitch.ethernetPorts)
            {
                if (port.peerNode == node)
                    return true; // Found a port already connected to this node.
            }

            return false; // No port has this node connected to it.
        }

最后,以防万一我错过了什么或者只是为了安全起见,我实现了一个EventArgs带有int timeToLive变量的自定义类型。每次节点处理消息时,此变量都会递减,如果达到 0,则丢弃该消息。

于 2013-04-08T12:30:03.277 回答