2013-11-14 2 views
7

विशेष रूप से एक धागा TPL Task.Factory.StartNew का उपयोग कर उत्पन्न करने वाला होगा? MSDN resourceफ़ाइल है। रीडअल्टटेक्स्ट थ्रेड सुरक्षित है?</p> <pre><code>Task.Factory.StartNew(() => { File.ReadAllText(@"thisFile.txt"); }); </code></pre> <p>किसी भी मुद्दे के कारण, आदि:

पर थ्रेड सुरक्षा का कोई उल्लेख नहीं दिखता है यह एक 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

मुझे लगता है कि यदि जॉन और मार्क ने आपके प्रश्न का उत्तर दिया तो आप 1. रात में शांति से सो सकते हैं। 2. जानें कि आपको अपना जवाब मिल गया है :) – Noctis

उत्तर

12

यह ठीक है - फ़ाइल को एक ही समय में कुछ भी लिखना नहीं मानता है, इस स्थिति में आप फ़ाइल खोलने में सक्षम नहीं हो सकते हैं (या आंशिक लिख सकते हैं)।

documentation of File के अनुसार:

किसी भी सार्वजनिक स्थिर इस प्रकार के सदस्यों (विजुअल बेसिक में साझा) धागा सुरक्षित हैं। किसी भी इंस्टेंस सदस्यों को थ्रेड सुरक्षित होने की गारंटी नहीं है।

(ऐसा नहीं है कि वहाँ किसी भी उदाहरण तरीकों हो सकता है, के रूप में यह एक स्थिर वर्ग है ...)

7

हां, यह स्वयं में थ्रेड-सुरक्षित होगा; हालांकि, यह अभी भी फ़ाइल-सिस्टम के सामान्य नियमों के अधीन है: एक ही फ़ाइल के समवर्ती उपयोग पर निर्भर करता है कि प्रतिस्पर्धी हैंडल द्वारा कौन से झंडे का उपयोग किया जाता था। यदि किसी भी हैंडल ने इसे विशेष पहुंच के लिए चिह्नित किया है, तो यह आईओ-संबंधित अपवाद के साथ विफल हो जाएगा।

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

यहां व्लाद प्रस्तावित वैसे ही एक तरीका है। मैं रीडिंग के फाइलशेयर विकल्प का उपयोग कर रहा हूं, इसलिए अन्य स्ट्रीम एक ही फाइल से पढ़ सकते हैं।

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); 
} 
संबंधित मुद्दे