2008-10-20 389 views
1

我們正在監控寫入XML Manifest的定製應用程序(其源代碼不受我們控制)的進度。有時,應用程序由於無法寫入清單文件而卡住了。儘管我們通過使用File.Close顯式關閉文件句柄並在Using Blocks中創建文件變量來覆蓋我們的跟蹤。但不知何故,它一直在發生。 (我們的應用程序是多線程的,最多有三個線程可能正在訪問該文件。) 另一個有趣的事情是,他們的應用程序在三個不同的事件(添加項目,刪除項目,完成項目)更新此清單,但我們只有一個事件(項目完成)。我的代碼如下如何避免文件阻塞

using (var st = new FileStream(MenifestPath, FileMode.Open, FileAccess.Read)) 
{ 
    using (TextReader r = new StreamReader(st)) 
    { 
     var xml = r.ReadToEnd(); 
      r.Close(); 
      st.Close(); 
      //................ Rest of our operations 
    } 
} 
+0

希望以下鏈接有幫助。 http://stackoverflow.com/questions/119548/problem-in-writing-to-single-file-in-web-service-in-net – pradeeptp 2008-10-20 11:31:38

+0

正確的做法 - 使用鎖定,以便線程不嘗試同時訪問文件。當我有多個線程記錄到同一個文件時爲我工作。創建一個庫來管理訪問文件,你是金。 – ScottCher 2008-10-20 13:44:30

回答

2

如果您只是從文件中讀取,那麼您應該能夠傳遞一個標誌來指定共享模式。我不知道你如何在.NET中指定它,但是在WinAPI中,你將通過FILE_SHARE_READ | FILE_SHARE_WRITECreateFile()

我建議你檢查你的文件API文檔,看看它提到了共享模式。

0

因爲那個人正在對所有進程的文件訪問完全控制,而正如我提到的一個進程第三方沒有源ACCCESS的問題是不同的上市。我們的應用程序工作正常。然而,他們的應用程序似乎卡住了,如果他們不能控制文件。所以我願意找到一種不影響其運行的文件訪問方法。

1

兩件事情:

  1. 你應該做你的作業的其餘部分using報表的範圍之外。這樣,您不會冒險使用封閉流和閱讀器。另外,您不需要使用Close方法,因爲當您退出using語句的範圍時,將調用Dispose,這是等效的。
  2. 您應該使用具有FileShare枚舉的超載。鎖定本質上是偏執狂,因此文件可能會自動鎖定以保護您免受自己的傷害。 :)

HTH。

0

如果一個線程在另一個線程正在寫入時試圖從該文件讀取數據,則可能會發生這種情況。要避免這種情況,您需要多個讀者但一次只需要一個編寫器,請使用ReaderWriterLock或System.Threading命名空間中的.NET 2.0 ReaderWriterLockSlim類。

0

另外,如果你使用.NET 2.0+,可以簡化您的代碼只是:

string xmlText = File.ReadAllText(ManifestFile); 

參見:File.ReadAllText on MSDN