2011-11-03 52 views
2

我正在編寫一個多線程控制檯應用程序,它從Web下載PDF文件並將其複製到我們的內容服務器位置(Windows服務器)上。這也是將文件傳送到我們網站的相同位置。 由於併發性問題,例如網站上的用戶從內容服務器請求pdf文件,同時文件正在寫入或由控制檯應用程序更新,我對此方法持懷疑態度。是一個IO異常。 (如果原始內容隨時間變化,應用程序也會更新PDF文件) 有沒有辦法控制併發問題?IO操作的併發問題

+0

在控制檯應用程序完成下載之前,用戶將如何知道該文件? – Oded

+0

好吧...應用程序運行多次,並基於原始pdf的更新更新現有文件。因此,如果用戶正在訪問控制檯應用程序試圖更新的特定文件,則會發生IO異常並且文件不會更新 – karry

+2

關於下載:您最好下載到一個位置並將文件移動到另一個位置在他們完全下載之後,它們可以在稍後被服務的位置。 – kd7

回答

2

您可能希望您的操作創建和更新它們所服務的文件是原子的,以便處理這些文件的任何其他進程都可以獲得正確的版本,而不是那些仍然可以寫入的文件。

您可以將文件寫入臨時目錄,然後將它們移動到目標文件夾中,而不是實際將文件寫入它們的位置。

同樣,爲了更新它們,你應該檢查你的應用程序何時更新那些文件本身沒有改變直到寫入完成。例如,您可以通過在應用程序開始寫入文件後進行睡眠來測試這一點。

+1

我同意......我討厭在我參與這個項目的階段改變設計,但我是爲了做正確的事情。感謝您的答覆。 – karry

+1

更好地更改設計並修復一些錯誤,而不是發送一個充滿最終用戶將會看到的錯誤的產品,對嗎?希望你的代碼不會太緊密地耦合到你將要寫這些文件的位置。如果是這樣,你可能想考慮使這些事情更容易改變。如果可以,請將它們放入應用程序配置中。 – tjarratt

+1

是的......這是真的!我確實將所有的位置信息存儲在app.config中。無論如何,我總是試着做正確的事情,即使它意味着稍晚的發佈......在這種情況下......我正在將所有文件寫入臨時文件夾,並在所有線程完成處理後,將它們全部複製到內容服務器中各自的文件夾結構....我認爲這將是更好的方法。任何coments/suggstions ?? – karry

0

將標記文件隱藏,直到複製或更新完成。

1

詳細信息取決於您使用的是哪種Web服務器軟件,但此問題的關鍵是爲每個版本的文件指定不同的名稱。相同的URL,請注意,但底層文件系統上的名稱不同。

一旦更新版本的文件準備就緒,請更改Web服務器的配置,以便URL指向新文件。在任何功能合理的Web服務器中,這應該是一個原子操作。

如果Web服務器沒有內置支持,則可以通過自定義服務器端腳本來提供文件。