2013-04-07 41 views
4

我目前正在想辦法解決這一模擬連接的對象,如電源在網絡系統設備或控制消息之間的資源和信息的傳遞:TPL Dataflow是否適用於此設計類型?

enter image description here CLICK FOR LARGER IMAGE.

最近我一直在尋找進入TPL Dataflow不是因爲它的線程和並行性,而是因爲它能夠很好地實現數據的流水線處理,而不需要大量的混亂的代碼處理邊界情況。仿真只會運行一次,每500ms左右一次,並且不是時間關鍵。

我一直在玩圖書館,並已閱讀文檔和現在幾次,但我正在努力實現它的解決方案。上圖中的節點概念我不確定什麼適合Dataflow節點。

我很想避開TPL數據流是否是一個不錯的選擇這裏一些建議,如果是基本實現每個數據流塊同行所描繪的節點組成。

+0

那麼大部分藍色箭頭都是網絡傳輸? – usr 2013-04-07 11:48:21

+0

你的模擬時間有多重要?由於數據流節點大多是獨立的,通常不能保證時間。另外,功率單位是否是離散的?換句話說,一個節點可以請求0.5個單位嗎? – svick 2013-04-07 12:02:38

+0

@usr所有的藍色箭頭都是'連接'。 – 2013-04-07 12:06:10

回答

1

經過深思熟慮,原型設計和研究後,我終於實現了使用事件和代表的解決方案,它的工作非常好!

唯一的主要設計的問題是,會出現的情況下,如果,例如,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,則消息將被丟棄。

4

我不認爲TPL Dataflow適合這種情況。有幾個原因:

  1. TDF沒有雙工(雙向)通信,你會以某種方式需要螺栓。
  2. 在TDF中,塊通常接收消息,然後生成更多消息沿管道發送。這似乎不是你所需要的(除了集線器節點),至少不是邏輯上的。

但我認爲您的要求不需要像TDF那樣重量輕的東西。我想你應該做的是:

  1. 創建的消息發送,可能使用一個客戶端 - 服務器式的建築風格的簡單庫:一個客戶端(例如消費者節點或分發節點)將消息發送到服務器(例如分配節點或電力節點),服務器可能會延遲迴復。如果一個客戶端連接到多個服務器,它將同樣的消息發送給它們,並決定如何處理多個響應(可能只接受第一個響應;這也意味着客戶端必須能夠拒絕響應)。
  2. 創建一個PowerStore類,該類可以存儲電源並可以用來接受它。它將返回一個Task,所以消費者可以等待直到電源可用。
  3. 使用上述兩點,構建節點應該相對簡單。
相關問題