2010-07-26 41 views
3

我已經繼承了一些代碼,它涉及將數據(從外部源獲取)寫入XML文件的計劃任務,以及一個讀取說XML文件獲取信息提交給訪問者。在單獨線程中用XmlWriter.Create()和XmlDocument.Load()處理IOExceptions

沒有同步到位,不用說,有時計劃的任務無法寫入文件,因爲它目前打開供閱讀。

作家代碼的心臟是:

XmlWriter writer = XmlWriter.Create(fileName); 
try 
{ 
    xmldata.WriteTo(writer); 
} 
finally 
{ 
    writer.Close(); 
} 

和閱讀器代碼的心臟是:

XmlDocument theDocument = new XmlDocument(); 
theDocument.Load(filename); 

(是沒有例外的任一端處理)

我我不知道如何以最佳方式嘗試同步這些。據我所知,無論是XmlWriter.Create()還是XmlDocument.Load()都可以使用任何有關文件訪問模式的參數。我是否應該自己管理底層FileStream(使用適當的訪問模式)並使用接受Stream參數的.Create()和.Load()重載?

或者我應該趕上IOExceptions並做一些「趕上,等待幾秒鐘,重試」的方法?

回答

2

只要你的網站並不需要寫回加載的XmlDocument的,我會通過FileStreamFileShare.ReadWrite集加載它。這應該允許您的其他線程中的XmlWriter寫入文件。

如果這不起作用,您也可以嘗試從FileStream中讀取xml到MemoryStream中,然後儘快關閉該文件。我仍然會使用FileShare.ReadWrite打開文件,但這樣可以最大限度地減少讀者訪問文件中的數據所需的時間。

通過使用FileShare.ReadWrite(或FileShare.Write作爲共享模式)作爲共享模式,可能會導致您在閱讀文檔時更新文檔。這可能會導致無效的XML內容,從而阻止XmlDocument.Load調用成功解析它。如果你想避免這種情況,你可以嘗試與臨時的「鎖定文件」同步。不是允許文件共享,而是防止兩個線程同時進行訪問,並且在其中任何一個線程正在處理文件時,向磁盤寫入一個空的臨時文件,指出這一點。處理(讀取或寫入)完成時,刪除臨時文件。這可以防止在任何一端拋出異常,並允許您同步對文件的訪問。

還有其他一些選項可以使用。你可以簡單地讓兩端吞下任何異常,並等待一段時間再嘗試,儘管這不是最好的設計。如果你足夠了解.NET的線程選項,你也可以使用命名系統Mutex,這兩個過程(你的寫作過程和你的網站過程)都知道。然後你可以使用Mutex來鎖定,而不必擔心鎖定文件。

+0

感謝您的支持 - 我想我會採用在讀取中使用FileShare.ReadWrite FileStream的方法。我主要關心的是確保更新永遠不會失敗,因爲當前正在讀取的文件,這種方法應該保證,對嗎? – Carson63000 2010-07-26 03:22:14

+0

它應該保證更新不會失敗,但是如果文檔在讀取時發生更改,則網站可能會因異常而失敗。 – jrista 2010-07-26 04:22:26