2010-10-01 6 views
27

11/18/2014 को अपडेट किया गया - लॉग 4नेट स्रोत भंडार ब्राउज़ करते समय, मैंने पाया कि लॉजिकल थ्रेड कॉन्टेक्स्ट का कार्यान्वयन नवंबर 2011 में संशोधित किया गया था ताकि यह CallContext.LogicalSetData (और उन्हें लॉजिकल गेटडेटा का उपयोग करके प्राप्त कर सके) का उपयोग करके अपनी संपत्तियों को संग्रहीत कर सके। यह महत्वपूर्ण है क्योंकि इसका मतलब है कि LogicalThreadContext अब सही तरीके से काम करना चाहिए। LogicalThreadContext में संग्रहीत कोई भी डेटा किसी भी बच्चे के धागे या कार्यों में "प्रवाह" होना चाहिए। यह थ्रेडकॉन्टेक्स्ट (और लॉजिकल थ्रेड कॉन्टेक्स्ट का पुराना कार्यान्वयन) से तुलना करता है जहां संदर्भ में संग्रहीत डेटा वर्तमान थ्रेड के लिए स्थानीय रहेगा और बाल धागे/कार्यों में नहीं चलाया जाएगा।log4net.ThreadContext और log4net.LogicalThreadContext के बीच क्या अंतर है?

http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/Util/LogicalThreadContextProperties.cs?r1=1165341&r2=1207948&diff_format=h

उम्मीद है कि किसी को इस पुराने सवाल पर हो रहा यह जानकारी उपयोगी मिलेगा:

आप रुचि रखते हैं, यहाँ परिवर्तन है।

log4net दो अलग-अलग "थ्रेड संदर्भ" ऑब्जेक्ट प्रदान करता है: ThreadContext और LogicalThreadContext, जिनमें से प्रत्येक में एक संपत्ति बैग, गुण हैं। थ्रेडकॉन्टेक्स्ट में ThreadContextProperties बैग है जबकि लॉजिकल थ्रेड कॉन्टेक्स्ट में LogicalThreadContextProperties बैग है।

थ्रेडकॉन्टेक्स्ट शायद अधिकतर "एमडीसी" के रूप में जाना जाता है। लॉजिकल कॉन्टेक्स्ट शायद अधिकतर "एलडीसी" के रूप में जाना जाता है। मैं इस पोस्ट के बाकी हिस्सों के लिए संक्षिप्त नाम का उपयोग करूंगा।

एमडीसी.प्रोपर्टीज System.Threading.Thread.SetData का उपयोग करके कार्यान्वित किया गया है जबकि एलडीसी.प्रोपर्टीज को System.Runtime.Remoting.Messaging.CallContext.SetData का उपयोग करके लागू किया गया है।

तुलना के लिए, एनएलओजी केवल थ्रेड स्थानीय गुणों को संग्रहीत करने के लिए "एमडीसी" (जिसे अब मैपड डिग्नोस्टिक कॉन्टैक्स के रूप में जाना जाता है) का खुलासा करता है। एनएलओजी का कार्यान्वयन सिस्टम का उपयोग करता है। थ्रेडिंग। थ्रेड। सैटडाटा, इसलिए इसका कार्यान्वयन लॉग 4नेट के समान है।

दोनों लॉग 4नेट और एनएलओजी में, "एमडीसी" गुण एक शब्दकोश में संग्रहीत होते हैं जो स्वयं थ्रेड स्थानीय भंडारण में संग्रहीत होता है।

इस तरह के मामले में, [थ्रेडस्टैटिक] से सजाए गए वर्ग सदस्य चर में शब्दकोश को संग्रहीत करना बराबर होगा?

[ThreadStatic] 
private static IDictionary<string, string> threadProperties; 

.NET 4.0 की नई थ्रेडलोकल कक्षा का उपयोग करके समकक्ष (या समान) घोषणा क्या हो?

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

मुझे this लिंक मिला जो लॉग 4नेट डेवलपर्स, निको कैडेल में से किसी एक के अंतर के बारे में कुछ अच्छी जानकारी प्रदान करता है, लेकिन यह अभी भी मुझे स्पष्ट नहीं है।

एक बड़ा सवाल, सीधे log4net से संबंधित नहीं है थ्रेड.SetData और CallContext.SetData के बीच व्यावहारिक अंतर क्या है?

CallContext एमएसडीएन आलेख के अनुसार, कॉलकॉन्टेक्स्ट डेटा को किसी अन्य ऐपडोमेन में प्रचारित किया जा सकता है। प्रचारित होने के लिए, कॉलकॉन्टेक्स्ट में संग्रहीत डेटा आइटम को ILogicalThreadAffinative इंटरफ़ेस का खुलासा करना होगा। तो, यह थ्रेड.SetData और CallContext के बीच एक अंतर प्रतीत होता है।

निको कैडल लिंक के अनुसार, log4net ILogicalThreadAffinative को लागू नहीं करता है, इसलिए एलडीसी गुणों का प्रचार नहीं किया जाएगा।

शायद यहां पर्याप्त है कि मुझे अपने स्वयं के प्रश्न का उत्तर देने में सक्षम होना चाहिए, शायद नहीं। मैं अभी भी समझने पर काम कर रहा हूं।

यदि आप log4net का उपयोग करते हैं, तो क्या आप प्रत्येक एमडीसी, एलडीसी, दोनों का उपयोग करते हैं? यदि आप एमडीसी का उपयोग करते हैं, तो ऐसा इसलिए है क्योंकि अधिकांश "असली दुनिया" उदाहरण इसका उपयोग करते हैं? यदि आप एलडीसी का उपयोग करते हैं, तो इसका उपयोग करने के लिए आपके पास एक विशिष्ट कारण है? यदि आप दोनों का उपयोग करते हैं, तो आप किस प्रकार का उपयोग करना चुनते हैं?

ध्यान दें कि मैंने एमडीसी (और शायद एलडीसी) के संबंध में कुछ लेख देखे हैं, शायद थ्रेड स्विचिंग के कारण एएसपीनेट अनुप्रयोगों में सही काम नहीं कर रहे हैं। मुझे इस समस्या में विशेष रूप से दिलचस्पी नहीं है क्योंकि मैं एएसपीनेट में काम नहीं कर रहा हूं। पहले से

What are best practices for using thread local storage in .NET?

.Net: Logical thread and Thread Local Storage?

धन्यवाद:

वास्तव में, मुझे लगता है कि चर्चा करने के लिए योगदान कर सकते हैं इतने पर यहाँ उपयोगी पदों की एक जोड़ी मिल गया है!

उत्तर

8

चेतावनी: यह अनुमान है।

मान लें कि आप एक सर्वर लिख रहे हैं, और एक अनुरोध की सेवा का मतलब है कि आपको विभिन्न सेवाओं के समूह से बात करनी है। पूरी तरह से आधुनिक डेवलपर होने के नाते, आप इन अनुरोधों को असीमित रूप से बनाते हैं, जब मूल अनुरोध का जवाब देने के लिए सब कुछ जवाब दिया जाता है (या समय समाप्त हो जाता है)।

इसका मतलब है कि एक ही अनुरोध से संबंधित कार्य कई अलग-अलग धागे (वेब ​​सेवा प्रतिक्रियाओं को असीमित रूप से संसाधित करना) में बिखरा हुआ है। I संदिग्ध कि CallContext का उपयोग "सब कुछ जो मैं कर रहा हूं, इस धागे के अनुरोध के कारण अलग-अलग धागे" के प्रचार के लिए किया जाता है, ताकि आप उस अनुरोध के लिए सभी लॉग एकत्र कर सकें। ThreadContext वहां मदद नहीं करेगा। ध्यान दें कि मुझे लगता है कि सभी काम एक ऐपडोमेन में किया जा रहा है, इसलिए आपकी चिंता कोई समस्या नहीं होगी।

+0

दरअसल ऐसा लगता है कि .NET 4.5 वेब एपीआई और एसिंक अनुरोधों के साथ मेरा वर्तमान अनुभव यह नहीं है कि कॉलकॉन्टेक्स्ट पास नहीं हुआ है, बल्कि यह थ्रेड के केवल उस आमंत्रण तक ही सीमित है। मैंने एक धागे का जवाब दिया जो मुझे यहां कुछ विस्तार से ले जाता है http://stackoverflow.com/questions/4507968/whats-the-difference-between-log4net-threadlogicalcontext-and-log4net-threadcon –

+0

@TommyG .: इस टिप्पणी पर तीसरा प्रयास :) ऐसा लगता है कि यहां खेलने पर कई कारक हैं, और वे ढांचे के संस्करण और log4net के संस्करण दोनों पर निर्भर करते हैं। Http://stackoverflow.com/questions/9781321/ देखें - ऐसा लगता है कि 'कॉलकॉन्टेक्स्ट' * * काम करना चाहिए, लेकिन log4net में एक बग है (या था) जो' लॉजिकल थ्रेड कॉन्टेक्स्ट 'को इसके साथ खेलने से रोकता है। –

+0

हाय जॉन, यह लॉजिकल थ्रेड कॉन्टेक्स्ट की मेरी समझ थी, इसे पढ़ने से भी, लेकिन उस अन्य प्रश्न को साझा करने के लिए धन्यवाद, यह अच्छी जानकारी है। –

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