2013-11-14 5 views
7

В частности будет нерест нити с помощью TPL Task.Factory.StartNew:Безопасна ли File.ReadAllText?

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

вызывает какие-либо проблемы, и т.д.? Там, как представляется, не упоминается безопасность потока на MSDN resource

Это в среде веб-службы SOAP.

Ps Пожалуйста, я не хочу знать о про или минусах использования Задачи в веб-среде. Я полностью осведомлен об этих проблемах, , пожалуйста,, просто примите это как должное, что в моем случае эта модель оправдана, спасибо.

+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

Я думаю, что если Джон и Марк ответят на ваш вопрос, вы можете спокойно спать по ночам. 2. Знайте, что вы получили свой ответ :) – Noctis

ответ

12

Все в порядке - при условии, что ничего не записывается в файл одновременно, и в этом случае вы не сможете открыть файл (или можете видеть частичную запись).

Согласно documentation of File:

Любые открытые (Shared в Visual Basic) члены этого типа являются потокобезопасными. Любые члены экземпляра не гарантируют безопасность потоков.

(Не то, что могут быть какие методы экземпляра, так как это статический класс ...)

7

Да, это само по себе будет потокобезопасным; однако он по-прежнему подчиняется обычным правилам файловой системы: одновременный доступ к одному файлу зависит от того, какие флаги использовались конкурирующими дескрипторами. Если какой-либо дескриптор отмечен для исключительного доступа, то он будет терпеть неудачу с исключением, связанным с IO.

1

Там на самом деле нет такого понятия, как «Потокобезопасная» без определения того, что используются операции.

Если все потоки (и процессы!) Просто читают файл в любом случае, чтение безопасно. Если, однако, некоторые из потоков (или других процессов) записывают в файл, вы можете получить полуобработанную информацию, вы никогда не знаете, как организована запись.

Для более безотказного доступа, можно использовать

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

documentation для File.ReadAllText ничего не сформулирует и поэтому не гарантирует ничего о блокировке.

0

Вот путь, похожий на то, что предложил Влад. Я использую параметр FileShare Read, поэтому другие потоки могут читать из того же файла.

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); 
}