2008-10-06 16 views
7

मुझे अपने आवेदन में एक आवश्यकता है जो मुझे लगता है कि थ्रेड स्थानीय भंडारण का उपयोग करके मुझे पूरा किया जा सकता है, लेकिन मुझे आश्चर्य है कि यह उन चीजों में से एक है जो इससे बचने के लिए सबसे अच्छा है।.NET में थ्रेड स्थानीय संग्रहण का उपयोग करने के लिए सर्वोत्तम प्रथाएं क्या हैं?

मैं इस विषय पर कुछ लेख पढ़ा है:

http://www.dotnetcoders.com/web/Articles/ShowArticle.aspx?article=58

http://msdn.microsoft.com/en-us/library/system.threadstaticattribute(vs.80).aspx

मैं कैसे इसका इस्तेमाल करने के पता है, मैं सिर्फ अगर मैं इसका इस्तेमाल करना चाहिए सोच रहा हूँ।

कोई सलाह, गेटचास के बारे में पता होना चाहिए?

[संपादित करें]

यहाँ उपयोग मामला है:

मैं कुछ तरीकों कि प्रत्येक प्रश्न के बारे में प्रवेश करने का एक बहुत कुछ कर के माध्यम से सभी डेटा का उपयोग फ़नल। एक चीज जो मैं लॉग करता हूं वह कमांड टेक्स्ट का पूरा डंप होता है जिसमें कमांड कमांड होते हैं ताकि मैं सीधे अपने ट्रेस लॉग से एसक्यूएल प्रबंधन स्टूडियो में कॉपी-पेस्ट कर सकूं।

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

मैं अपने डेटा एक्सेस क्लास के विधि हस्ताक्षर को बदलना नहीं चाहता हूं, इसलिए मैं अपवाद प्राप्त करते समय इसे बाहर निकालने के लिए, बस स्टैक के नीचे कुछ संदर्भ पारित कर सकता हूं। मैं सोच रहा था कि शायद "lastsqlcommand" जैसे कुछ डालने के लिए टीएलएस एक अच्छी जगह होगी, लेकिन यह व्यवहार्य समाधान की तरह नहीं दिख रहा है।

+0

मैंने हमेशा थ्रेड-लोकल स्टोरेज से परहेज किया है और एक ही चीज़ करने के लिए एक और तरीका खोजा है। मेरा विचार हमेशा थ्रेड-स्थानीय भंडारण प्रत्यक्ष पहुंच से धीमा है (सुनिश्चित नहीं है कि यह सही है या नहीं)। मैं उत्सुक हूं कि दूसरों को भी क्या लगता है। – dongola7

उत्तर

7

एएसपीनेट अनुप्रयोगों के लिए एक गोचा: एक अनुरोध की प्रसंस्करण थ्रेड स्विच कर सकती है, यानी यदि समान सत्र में समानांतर अनुरोध हैं। इस वजह से, आपने जो कुछ भी TLS में रखा है, वह HttpApplication.PostRequireRequestState ईवेंट से पहले हो सकता है, क्योंकि आप एक अलग थ्रेड पर हैं।

[प्रश्नकर्ता द्वारा संपादित करें]

मेरी विशेष उपयोग के मामले के लिए, मैं SqlException.Data शब्दकोश है, जो मैं तो पुनः प्राप्त जब मैं अपवाद विवरण लॉग इन करने के कुंजी-मान पेयर जोड़ने समाप्त हो गया। यह मुझे वह कार्यक्षमता देता है जो मैं थ्रेड स्थानीय भंडारण का उपयोग करने की उम्मीद कर रहा था।

+0

यह वही है जो मैं खोज रहा था। मुझे संदेह है कि यह इस परिदृश्य में भरोसेमंद नहीं हो सकता है। धन्यवाद। –

+0

यह एक पुराना उत्तर है, लेकिन थोड़ा सा स्पष्ट करने के लिए: एएसपी.नेट केवल बहुत विशिष्ट परिदृश्यों में धागे को स्विच करता है। सबसे बड़ा एसिंक आईओ विधियों का उपयोग कर रहा है - उदाहरण देखें लोत्का और गुथरी चर्चा करते हुए: http://www.lhotka.net/WeBlog/PermaLink ,guid,019e3c37-38ed-492e-b769-16e1a57fed0a.aspx – EBarr

6

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

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

0

एक उदाहरण के साथ नया .net 4 ThreadLocal<T> कक्षा पर एक नज़र डालें, अधिक जानकारी here

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

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