2010-02-04 194 views
1

我們希望在我們的商店中替換POS軟件的當前更新系統。目前,我們的網絡服務器上有一個文件夾,其中包含我們的註冊每30分鐘左右調用的腳本。他們傳遞他們當前的版本號,服務器返回一個XML響應,其中包含需要更新的任何文件,哈希以及用於寄存器下載更新文件的任何其他相關信息。多線程更新服務器

我們需要一個服務來監聽我們發送的UDP數據包,以便觸發更新。這將防止寄存器不必要地輪詢更新。我們正在編寫一個更新服務器,它將偵聽來自機器的TCP連接,進行身份驗證,執行一些日誌記錄,然後發送已更改文件的更新。我們希望轉移到自定義更新服務器,因爲我們需要在某些機器上發佈POS版本,以便在公司發佈之前進行測試後進行試運行。

我已經編寫了處理傳入連接的代碼,並創建了一個新線程來處理與該客戶端的通信等,但是我很難用多線程方式處理文件I/O。

我敢肯定,如果它已經在另一個線程中打開,我將無法通過從一個線程打開它來訪問文件。我不想將這些文件讀入內存,並且事先將它們保存在線程安全的容器中,因爲這會佔用大量內存,特別是如果事實證明我需要爲每個線程保留一份副本以避免線程問題。

如何在不使用大量內存或導致線程等待其他線程完成文件的情況下以線程安全的方式從磁盤/內存訪問這些文件的最佳方式是什麼?

編輯:忘了提及我們正在使用C#。

+0

這聽起來像我需要的是一個數據庫或Web服務。 – Nate 2010-02-04 22:44:19

回答

2

多個線程可以打開一個文件。只需正確設置你的文件模式。

如果兩個線程嘗試打開文件的讀/寫句柄,將會出現錯誤(至少在Windows上)。

+0

這有助於瞭解,因爲我們只需要從文件中讀取。我只是想確保在跳入文件I/O部分之前,它不會導致打開文件以供從多個線程讀取的問題。 – Matt 2010-02-04 22:56:43

1

See C# async IO documentation.

正在改變的文件嗎?爲什麼你不能從單獨的線程讀取它們?通常可以在單獨的線程中兩次打開一個文件。但不要指望你的寫/讀命令。

如果寄存器錯過更新會發生什麼情況,因爲它可能會發生UDP更新通知?你可能應該至少繼續至少進行民意調查。

它聽起來就像你重塑一個Web服務器...如果它是唯一可以讀取網絡服務器acheive同樣的效果(TCP連接,記錄,文件傳送)的正確配置

0

Windows具有可能感興趣的TransmitFile函數。這樣你可以讓操作系統爲你處理任何緩存。這是一個C調用,但從C++/CLI項目中使用它應該相當容易。該調用可以使用重疊的io異步完成。

這樣Windows緩存管理器讀取文件並在套接字上發送數據,而不必觸碰數據。該功能旨在通過套接字進行高性能文件數據傳輸。

只需打開文件,保存緩存文件的句柄(以便您不需要一次又一次地打開它們),並調用TransmitFile在連接的套接字上發送它們。您需要在服務器操作系統上才能正常工作(客戶端操作系統版本上的傳輸限制)。