WIndows NT服務和普通程式之間大資料傳輸問題

小弟季義欽發表於2013-09-23

問題:共享記憶體在Windows服務和普通程式之間無法工作

我的專案中有一個後臺服務,開機自啟動,然後會去伺服器上獲取大資料,快取在自己的地址空間中。

另外一個程式(Windows Form介面)啟動之後會來這個服務這裡獲取這些資料。


開始為了方便開發除錯,我的後臺服務並沒有做成服務,開發時候就是一個直接的程式,稱為程式A。

啟動之後從伺服器端獲取大資料,然後通過共享記憶體的方式傳遞給程式B(即那個Windows form介面)。


我採用共享記憶體方式,因為要說到效率首先就想到共享記憶體,C#中共享記憶體的方法封裝在MemoryMappedFile類中,CreateNew()建立共享記憶體,OpenExsisting()開啟已有的共享記憶體來訪問。

開發的時候,程式A以程式的方式執行,我的這個流程工作沒有任何問題。


但是今天部署的時候,將程式A安裝位Windows服務之後,共享記憶體就無論如何也不能工作了。

要麼是找不到指定檔案,要麼就是什麼錯誤也沒有,但是什麼也讀不到。。。。

我在網上查了一下,貌似是說WIndows7下面 WIndows服務和程式是不能採用共享記憶體來進行資料傳輸的,而WIndows XP可以。。。 (我怎麼覺得很不合理呢???)

引用網路上的一個帖子的回覆:

=========================================================================

從vista以後的版本都測試不通過,winXp和win2003測試通過。 好像是為了安全性吧

=================================================================

另外我想說的是,Windows服務和普通程式,以及WinForm這些之間都是可以採用命名管道來進行通訊的。

訊息佇列也可以用於WIndows服務和普通程式之間的通訊,只是建立佇列的時候需要設定佇列的許可權,參見這裡


這個問題亟需解決!!!

解決方法:命名管道

根據i命名管道的讀寫方法write(char[] buffer, int offset, int count),可以知道命名管道一次可以傳送的資料量大小是int.MAXVALUE,就是2^31 = 2G。

所以一般來說同一個機器之間的大資料傳輸需求可以滿足,下面是我的程式碼:

(一)這是WIndows服務中的一個執行緒,開啟一個命名管道,等待獲取大資料的請求:



(二)這是普通程式(window form)的程式碼,連線到命名管道,請求接收資料:



下面兩個是用的到兩個序列化的方法:



相關文章