2012-04-16 25 views
5

बस एक सामान्य प्रश्न है, इस प्रकार मैं एक ASP.NET MVC 3 वेब एप्लिकेशन है जो स्वत: निपटान के लिए एक का उपयोग करते हुए बयान के अंदर स्ट्रीम रीडर का उपयोग कर एक विन्यास फाइल से पढ़ता विकासशील हूँ:सी # StreamReader के साथ गतिरोध के बारे में चिंतित

using (StreamReader sr = new StreamReader(filepath)) 
{ 

} 

मेरी चिंता यह है कि जब एकाधिक उपयोगकर्ता एप्लिकेशन चला रहे हैं, तो एक डेडलॉक तब होगा जब एप्लिकेशन के कई उदाहरण कॉन्फ़िगरेशन फ़ाइल से मान पढ़ रहे हों। मेरा सवाल यह है कि स्ट्रीम रीडर क्लास के साथ काम करते समय कोई समस्या है? सहजता से मैं नहीं सोचूंगा, क्योंकि मुझे लगता है कि स्ट्रीम रीडर केवल पढ़ने-योग्य मोड में फ़ाइल खोल रहा है और मैन्युअल संपादन के अलावा कॉन्फ़िगरेशन फ़ाइल में कोई बाहरी प्रक्रियाएं नहीं लिख रही हैं। मैं बस यह सुनिश्चित करना चाहता था कि यह एक मुद्दा होगा या नहीं। किसी भी अंतर्दृष्टि की सराहना की है।

उत्तर

8

मेरी चिंता का विषय यह है कि जब एक से अधिक उपयोगकर्ता आवेदन चल रहे हैं, एक गतिरोध जब आवेदन के कई उदाहरण विन्यास फाइल

नहीं से पढ़ने मान हैं हो जाएगा, चिंता मत करो है। कोई डेडलॉक नहीं होगा। आप पढ़ने के लिए फाइल खोल रहे हैं। तो आप समवर्ती पाठक हो सकता है। लेकिन अगर आप इस कोड को अपने कोड के किसी अन्य स्थान पर लिखते हैं तो आपको अपवाद मिलेगा। लेकिन कोई डेडलॉक नहीं। यदि आप पाठकों और लेखकों को किसी साझा संसाधन जैसे उचित रूप से सिंक्रनाइज़ करना चाहते हैं, तो आप ReaderWriterLockSlim कक्षा का उपयोग कर सकते हैं। यदि आप फ़ाइल को कभी भी नहीं लिखते (उसी प्रक्रिया या किसी अन्य प्रक्रिया से) तो आप ठीक हैं। लेकिन अगर आप फाइल को कभी भी लिखते हैं, तो हर बार इस फाइल को पढ़ने और पार्स करने से बचने के लिए, आपको केवल इसे एक बार पढ़ना चाहिए और इसे कुछ मेमोरी स्ट्रक्चर में कैश करना चाहिए। उदाहरण के लिए, .NET अनुप्रयोग कॉन्फ़िगरेशन सिस्टम कैसे काम करता है। यह एप्लिकेशन चलाने पर एक बार ऐप/web.config को पढ़ता है और पार्स करता है और फिर इसे तेज़ एक्सेस के लिए मेमोरी में संग्रहीत करता है। लेकिन निश्चित रूप से सब कुछ आपके सटीक परिदृश्य पर निर्भर करेगा।

+1

इसके अतिरिक्त, यदि आप वास्तव में इस कॉन्फ़िगरेशन फ़ाइल को पढ़ने वाले कई लोगों के बारे में चिंतित हैं, तो आपको इसे एक बार थ्रेड सुरक्षित क्षेत्र के अंदर पढ़ना चाहिए और फिर इसे भविष्य के उपयोग के लिए कैश करना चाहिए। – Tejs

+0

@Tejs, बहुत अच्छा बिंदु। मैं इसे अपने खाते में लेने के लिए अद्यतन कर दूंगा। –

संबंधित मुद्दे