よく考え、プロトタイプを作成し、調査した結果、最終的にイベントとデリゲートを使用してソリューションを実装し、非常にうまく機能しました!
唯一の大きな設計上の問題は、たとえば 3 つの配信ノードが三角形に接続されている場合、メッセージが無限ループに入る場合があることです。または、ノードがそれ自体に接続されている場合、または 2 つのノードが相互に複数回接続されている場合。これらのエッジ ケースのそれぞれについて、イベント リスナー接続のいくつかの単純なロジックで説明しました。
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 になるとメッセージは破棄されます。