2013-11-14 46 views
7

具體會產卵使用TPL Task.Factory.StartNew線程:File.ReadAllText線程安全嗎?

Task.Factory.StartNew(() => { 
     File.ReadAllText(@"thisFile.txt"); 
}); 

造成任何問題,等等?似乎沒有提到線程安全的MSDN resource

它在SOAP Web服務環境中。

Ps請,我不想知道在Web環境中使用任務的親和好處。我完全知道這些問題,,只是理所當然,在我的情況下這種模式是合理的,謝謝。

+2

[什麼](http://blogs.msdn.com/b/ericlippert/archive/2009/10/19/what-is-this-thing-you-call-thread-safe.aspx)你的定義中_thread safe_是什麼?其他線程不能干擾閱讀。但是文件沒有被鎖定,所以如果其他進程(或線程)在同一時間寫入文件,則會遇到麻煩。 – Vlad

+0

這一切都只是閱讀,根本沒有文件執行的文件。如果文件被覆蓋,這將是一項手動任務,很少會發生。 – Liam

+1

我認爲,如果喬恩和馬克回答你的問題,你可以1.晚上安靜地睡覺。 2.知道你已經得到了你的答案:) – Noctis

回答

12

這很好 - 假設沒有任何文件同時寫入,在這種情況下,您可能無法打開文件(或可能會看到部分寫入)。

由於每documentation of File

任何公共靜態此類型的成員(在Visual Basic中的Shared)都是線程安全的。任何實例成員不保證是線程安全的。

(這並不是說可以有任何實例方法,因爲它是一個靜態類...)

7

是的,這本身就是線程安全的;但是,它仍然遵循文件系統的通常規則:對同一文件的併發訪問取決於競爭句柄使用哪些標誌。如果任何句柄將其標記爲獨佔訪問,那麼它將失敗並出現與IO相關的異常。

1

其實是有沒有這樣的事情「線程安全」而不使用什麼操作。

如果所有線程(和進程!)只是以任一方式讀取文件,則讀取是安全的。但是,如果某些線程(或其他進程)正在寫入文件,您可能會收到一半的最新信息,您永遠不知道寫作是如何組織的。

爲了更防故障的訪問,你可以使用

using (var s = new FileStream(..., FileMode.Open, FileAccess.Read, FileShare.None)) 
using (var tr = new StreamReader(s)) 
{ 
    content = tr.ReadToEnd(); 
} 

documentationFile.ReadAllText沒有說明任何東西,因此不保證有關鎖定任何東西。

0

這是一種類似於Vlad提出的方法。我正在使用Read的FileShare選項,所以其他流可以從同一個文件中讀取。

byte[] buffer; 
using (FileStream fs = new FileStream("pathGoesHere", FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    buffer = new byte[fs.Length]; 
    fs.Read(buffer, 0, (int)fs.Length); 
}