2009-04-13 14 views
9

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

System.Configuration कक्षाएं, सबसे (सभी?) माइक्रोसॉफ्ट के नेट पुस्तकालय दस्तावेज में अन्य वर्गों, निम्नलिखित धागे की सुरक्षा जानकारी से एनोटेट की तरह:

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

इस के अपने पढ़ने के द्वारा, ConfigurationSection वस्तुओं ConfigurationManager.GetSection(string) और अन्य समान पद्धति (उदा OpenExeConfiguration(string exePath).GetSection(string)) धागे की सुरक्षित माना नहीं किया जाना चाहिए से लौटे और इस तरह कई निष्पादन संदर्भों द्वारा नहीं किया जाना चाहिए। यह एक सिंगलटन में ConfigurationSection संग्रहीत करने पर रोक लगाता है जो अन्यथा थ्रेड-सुरक्षित होगा क्योंकि जब सेक्शन ऑब्जेक्ट तक पहुंच सुरक्षित हो सकती है, तो ऑब्जेक्ट के सदस्य स्वयं सुरक्षित नहीं होते हैं। GetSection को

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

तो, System.Configuration का उपयोग थ्रेड-सुरक्षित तरीके से अतिरिक्त पार्सिंग और कॉन्फ़िगरेशन अनुभागों के आवंटन के बिना करने का कोई तरीका है? क्या आप अपने ConfigurationSection को माइक्रोसॉफ्ट द्वारा प्रदान की गई गारंटी की कमी से मुक्त करते हैं, भले ही आप इसे System.Configuration इंटरफेस के माध्यम से एक्सेस कर रहे हों (और यदि हां, तो ConfigurationSection के इंडेक्सर तक पहुंचने पर आप इसे थ्रेड-सुरक्षित कैसे लागू करेंगे कॉन्फ़िगर किए गए डेटा तक पहुंचने के लिए आवश्यक है)?

उत्तर

5

गेटसेक्शन से लौटाया गया उदाहरण थ्रेड-सुरक्षित नहीं है। इसका मतलब है कि आपको अपने सिंगलटन में इसका उपयोग करने के लिए लॉकिंग कोड जोड़ना होगा।

एकाधिक कॉल फ़ाइल को फिर से पार्स नहीं करते हैं, जब तक फ़ाइल बदल नहीं जाती है। डेटा स्मृति में कैश किया जाता है।

लॉकिंग का उपयोग करके आपकी थ्रेड सुरक्षा समस्या को आसानी से हल किया जा सकता है (मुझे यकीन नहीं है कि आपको तब तक आवश्यकता होगी जब तक कि आप रनटाइम पर कॉन्फ़िगरेशन नहीं बदल रहे हों), और कोई प्रदर्शन समस्या नहीं है।

+0

इस कारण से पिछले 5 महीनों में मुझे आईआईएस सर्वर यादृच्छिक रूप से दुर्घटनाग्रस्त हो रहा है। यह नहीं पता था कि क्यों (एमएससीआरएलआईबी में क्रैश एक ढेर ओवरफ्लो था) जब तक यह मेरी देव मशीन पर हुआ, और एक ऐपसेटिंग कॉल ने इसका कारण बना दिया था। मुझे लगता है कि यह मेरे प्रश्न का उत्तर देता है। धन्यवाद। –

0

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

प्रदर्शन के लिए, मैं यह मानने के लिए तैयार हूं कि एमएस ने इसे पहले से ही काफी कुशल बना दिया है और केवल उनके कार्यों का उपयोग किया है। याद रखें: समयपूर्व अनुकूलन बुराई की जड़ है।

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