我目前正在研究如何模拟连接对象之间的资源和消息传输,例如通过网络系统传输设备或控制消息:
我最近一直在研究TPL Dataflow,不是因为它的线程和并行性,而是它在没有大型杂乱代码处理边缘情况的情况下如何实现数据流水线操作。模拟只能每500ms左右运行一次,并且实际上不是时间关键。
我一直在玩图书馆,现在已经阅读过几次文档,但我很难用它来实现解决方案。在上面描述的节点概念中,我不确定什么适合Dataflow节点。
我希望得到一些关于TPL Dataflow是否适合这里的建议,如果是这样的话,那么Dataflow Block对应的每个图像节点的基本实现。
答案 0 :(得分:5)
我认为TPL Dataflow并不适合。有几个原因:
但我认为您的要求不需要像TDF那样重量级的东西。我想你应该做的是:
PowerStore
类,可用于获取电源。它将返回Task
,因此消费者可以等到电源可用。答案 1 :(得分:2)
经过深思熟虑,原型设计和研究我终于使用Events和Delegates实现了解决方案,并且工作得很好!
唯一的主要设计问题是,如果例如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,则会丢弃该消息。