5

私は現在、デバイスへの電力供給やネットワーク化されたシステムを介したメッセージの制御など、接続されたオブジェクト間のリソースとメッセージの送信をシミュレートする方法を検討しています。

ここに画像の説明を入力 クリックすると大きな画像が表示されます。

私は最近、TPL Dataflow をそのスレッド化と並列化のためではなく、エッジ ケースを処理する大規模で厄介なコードなしでデータのパイプライン処理をどれだけうまく実装できるかについて調べています。シミュレーションは 500 ミリ秒ごとに 1 回程度しか実行されず、実際には時間が重要ではありません。

私はライブラリをいじっていて、ドキュメントを読んで数回読んでいますが、それを使って解決策を実現するのに苦労しています. 上記のノードの概念のうち、何が Dataflow ノードに適合するかはわかりません。

TPL データフローがここに適しているかどうかについてアドバイスをいただければ幸いです。そうであれば、対応するデータフロー ブロックの図に示されている各ノードの基本的な実装について教えてください。

4

2 に答える 2

5

TPL Dataflow がこれにうまく適合するとは思いません。いくつかの理由があります:

  1. TDFには二重(双方向)通信がありません。何らかの方法でそれをボルトで固定する必要があります。
  2. TDF では、通常、ブロックはメッセージを受信し、パイプラインに沿って送信するメッセージをさらに生成します。少なくとも論理的には、(ハブ ノードを除いて) 必要なものではないようです。

しかし、あなたの要件では、TDF ほど重いものは必要ないと思います。あなたがすべきことは次のとおりだと思います:

  1. おそらくクライアントサーバーのようなアーキテクチャを使用して、メッセージ送信用の単純なライブラリを作成します。クライアント(消費者ノードまたは配布ノードなど)がサーバー(配布ノードまたは電力ノードなど)にメッセージを送信し、サーバーが応答します。遅れ。クライアントが複数のサーバーに接続している場合、クライアントはそれらすべてに同じメッセージを送信し、複数の応答を処理する方法を決定します (おそらく最初の応答のみを受け入れることによって。これは、クライアントが応答を拒否できる必要があることも意味します)。
  2. PowerStore力を蓄え、それを受け取るために使用できるクラスを作成します。が返されるTaskため、消費者は電力が利用可能になるまで待つことができます。
  3. 上記の 2 つのポイントを使用すると、ノードの構築は比較的簡単になります。
于 2013-04-07T16:22:29.557 に答える
2

よく考え、プロトタイプを作成し、調査した結果、最終的にイベントとデリゲートを使用してソリューションを実装し、非常にうまく機能しました!

唯一の大きな設計上の問題は、たとえば 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 になるとメッセージは破棄されます。

于 2013-04-08T12:30:03.277 に答える