2013-09-26 80 views
3

我試圖在兩個應用程序之間共享數據:第一個從傳感器獲取數據,我需要做的就是在我接收到另一個數據(WPF)時傳輸這些數據,應用程序(並繪製圖表)。在C#應用程序之間流式傳輸數據

的數據通過一個事件處理程序接收,那麼它的傳輸通過一個插座,就像這樣:

static TcpClient client = new TcpClient("localhost", 8181); 
    static double w, dba; 

    static void Write() 
    { 
     try 
     { 
      Stream s = client.GetStream(); 
      StreamReader sr = new StreamReader(s); 
      StreamWriter sw = new StreamWriter(s); 
      sw.AutoFlush = true; 
      while (true) 
      { 
       String line = "W:" + w + "DB/A:" + dba; 
       sw.Write(line); 
       Console.WriteLine(sr.ReadLine()); 
      } 
      s.Close(); 
     } 
     finally 
     { 
      client.Close(); 
     } 
    } 

的事情是,我需要把它放在一個單獨的線程? (因爲我試圖,不成功)因爲這樣,當eventHandler不斷被觸發併產生數據(將它存儲到兩個變量中)時,sw似乎無法繼續。

對不起,如果問題有點模糊,這是我第一次嘗試使用分佈式應用程序,所以我有點困惑。任何建議或幫助將非常感激!

TIA

+0

你是否需要兩個應用程序同時運行?如果其中一個沒有運行,你希望發生什麼? –

回答

3

使用memory mapped files,它允許您直接應用程序之間共享內存。這將比其他大多數方法快得多。

查看名爲非持久性內存映射文件的部分,其中詳細介紹瞭如何通過字符串名稱共享內存段。我在一個我爲調試目的而工作的應用程序中使用了它,並且它足夠快以至於我的C#應用​​程序可以實時讀取本機應用程序的內存。

如果您通過此方法傳輸數據,請考慮通常如何傳輸數據。確定輪詢頻率(比如說每100ms)並讓應用程序A將數據寫入內存映射文件。然後讓應用程序B讀取該內存映射文件並將其存儲在本地集合中。這是你的傳輸。

因此,A基本上將相同的結構寫入並重寫到內存映射文件中,B以給定的輪詢速率讀取它並存儲它在輪詢集合中的內容。

+0

這也應該在一段時間內(真),以保持傳輸,對不對?好的,事情是..我試過了,我可以通過StreamWriter將消息發送給WPF應用程序,但我無法同時傳輸和收集數據。你能指點我一個關於如何使用內存映射文件來傳輸數據的例子嗎? – Liunai

+0

只需編輯一些傳輸邏輯。 MSDN文章清楚地概述瞭如何編寫和讀取MMF的數據,因此傳輸比語法問題更爲合理。這就是爲什麼沒有發佈代碼。 –

1

如果兩個應用程序都是.net,那麼爲什麼不使用WCF進行進程間通信:比使用文件更健壯。看到這個鏈接WCF Basic Interprocess Communication

+0

WCF不如MMF那麼高效,如果她正在做傳感器輪詢,她可能需要它非常快。 –

相關問題