6

हमने हाल ही में कुछ मौकों पर सवाल उठाया है, जहां सवाल आया है कि डायनेमिक्स सीआरएम 2011 में, एक प्लगइन निष्पादन (यानी Execute() विधि का एक पास) उसी धागे पर रहने की गारंटी है।सीआरएम 2011 प्लगइन में थ्रेडिंग/परिवेश संदर्भ

मैं किसी भी वर्ग में ट्रेसिंग सेवा को पार करने से बचने के लिए परिवेश संदर्भ पैटर्न का उपयोग करके ट्रेसिंग को कार्यान्वित करना चाहता हूं जो ट्रेस करना चाहें। समस्या यह है कि जैसा कि हम जानते हैं कि प्लगइन केवल पंजीकृत चरण में एक बार तत्काल होता है और फिर उसी घटना से सभी बाद के संचालनों को पूरा करता है; इसका मतलब है कि मेरे पास Tracing.Current जैसी कुछ स्थिर संपत्ति नहीं हो सकती है, जिसमें मैं वर्तमान ITracingService उदाहरण असाइन करता हूं और मुझे जाना अच्छा लगता है। अगर मैंने ऐसा किया, तो ऑपरेशन आखिरी बार शुरू होने वाले सभी अन्य परिचालनों के लिए उदाहरण को ओवरराइट करेगा जो कि अभी भी चल रहा है (और इस प्रकार की सहमति असामान्य नहीं है)।

अब

अगर मुझे यकीन है कि सब कुछ के तहत Execute() विधि एक ही धागे में रहता है, मैं अभी भी एक परिवेश प्रसंग स्थिर क्षेत्रों के लिए [ThreadStatic] विशेषता का उपयोग इस्तेमाल कर सकते हैं हो सकता है:

public static class Tracing 
{ 
    [ThreadStatic] 
    private static ITracingService _current; 

    public static ITracingService Current 
    { 
     get 
     { 
      if (null == _current) 
      { 
       _current = new NullTracingService(); 
      } 

      return _current; 
     } 

     set { _current = value; } 
    } 
} 

मैं प्रवेश करते समय यह तय करेगा Execute() विधि और अंत में इसे साफ़ करें ताकि ट्रेसिंग सेवा उदाहरण का संदर्भ हटा दिया जाएगा। जो कुछ भी परिणाम मेरी समस्या के संबंध में हो सकता है -

केवल एक चीज मैं की तरह MSCRM प्लगइन्स के संदर्भ में सूत्रण के बारे में पता कर सकते हैं कि जाहिरा तौर पर अलग-अलग धागे ThreadPool से आते हैं।

क्या किसी के पास एमएससीआरएम प्लगइन्स के साथ थ्रेडिंग को कैसे संभाला जाता है, इस बारे में कोई गहन अंतर्दृष्टि है - या इस विशेष मामले में सोलिड कोड के साथ ट्रेसिंग की क्रॉस-कटिंग चिंता को सुन्दर तरीके से कैसे संभाला जा सकता है इस बारे में कोई अन्य विचार (एओपी/गतिशील अवरोध नहीं है यहां विकल्प)?

किसी भी मदद और पॉइंटर्स के लिए धन्यवाद।

+0

मैं थ्रेड सुरक्षित तरीके से चलने के बारे में आपकी चिंता को समझता हूं, लेकिन मुझे यकीन नहीं है कि मैं समझता हूं कि आप एक ही थ्रेड पर चलने के बारे में चिंतित क्यों हैं। क्या आप थोड़ा और समझा सकते हैं? – Daryl

+0

खैर, मुझे प्लगइन निष्पादन को अपने स्वयं के आईट्रैसिंग सेवा उदाहरण "संलग्न" के बिना किसी अन्य थ्रेड में स्थानांतरित करने से बचने की आवश्यकता होगी। मैं अभी तक यह पता लगाने में सक्षम नहीं हूं कि इस तरह के मामले में थ्रेडस्टैटिक चीज़ को कैसे संभाला जाएगा। – TeaDrivenDev

उत्तर

3

सरल और स्मार्ट-गधा जवाब: यदि ऐसा होता है तो यह दर्द होता है, तो ऐसा न करें। :)

परिवेश संदर्भ पैटर्न का उपयोग करने की आपकी स्वयं की आवश्यकता सीआरएम के डिजाइन पैटर्न के साथ संघर्ष कर रही है। सीआरएम कैसे काम करता है इसके बारे में सोचें - यह आपको IServiceProvider पास करता है, जिसमें आपको ट्रेसिंग सेवा समेत सभी चीजों की आवश्यकता होती है। यह आपके लिए सभी जटिल मल्टीथ्रेडिंग और ऑप्टिमाइज़ेशन को संभालता है, और केवल यह पूछता है कि आप फैंसी पैटर्न या स्थिर चर या थ्रेडिंग चाल के साथ इसे बाहर निकालने का प्रयास नहीं करते हैं। किसी भी वर्ग या तरीकों की जरूरत है कि करने के लिए IServiceProvider पास -

मेरे सिफारिश एक ही पैटर्न का उपयोग करें। बहुत आसान - साथ ही जब आपके पास एक अजीब बग है, तो आप सवाल नहीं करेंगे कि आपने माइक्रोसॉफ्ट के इंजीनियरों को सफलतापूर्वक आउटमार्ट किया है या नहीं। :)

+0

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

+0

क्या यह सिर्फ इतना है कि आप हर समय IServiceProvider से ट्रेसिंग सेवा निकालने के लिए कोड लिखने के बजाय Tracing.Current लिख सकते हैं? यदि ऐसा है, तो शायद ServiceProvider ऑब्जेक्ट से सी # एक्सटेंशन विधि लिखना देखें जो आसानी से ट्रेसिंग सेवा का संदर्भ प्राप्त करता है। या एक कोड स्निपेट का उपयोग करें जो आपके लिए बॉयलरप्लेट कोड चिपकाता है - यह संभवतः परिवर्तित नहीं होगा, और यदि ऐसा होता है, तो यह एक साधारण खोज/प्रतिस्थापन है। सबसे ऊपर, इस पर एक और 10 मिनट से अधिक खर्च न करें और असली व्यावसायिक समस्याओं को हल करना शुरू करें, आदमी! मुझे खुशी है कि मैं इस बारे में चिंता करने के लिए आपको भुगतान नहीं कर रहा हूं! :) –

0

मुझे डर है कि मैं केवल पूरे प्लगइन/धागे/स्थैतिक मुद्दे पर अनुमान लगा सकता हूं, जो आप प्रस्तावित करते हैं वह थोड़ा जटिल लगता है। तो एक विकल्प के रूप में, क्या आपने ट्रेस श्रोताओं का उपयोग करने पर विचार किया है?

आप अपने आवेदन भर में Trace.Writeline का उपयोग करते हैं तो एक भी ट्रेस श्रोता उन सभी संदेशों पर कब्जा होगा। इस तरह आपको चारों ओर एक ट्रेस ऑब्जेक्ट पास नहीं करना है।

उदाहरण के लिए:

Execute(...) 
{ 
    if(System.Diagnostics.Trace.Listeners 
     .Count(l => typeof(l) == MyCustomTraceListener) == 0) 
    { 
     System.Diagnostics.Trace.Listeners.Add(new MyCustomTraceListener()); 
    } 

    DoWork(); 
} 

DoWork() 
{ 
    System.Diagnostics.Trace.WriteLine("I'm doing work!"); 
} 

प्रासंगिक लिंक:

Trace Listeners और Walkthrough: Creating a Custom Trace Listener

+0

मैंने उनके बारे में पढ़ा है, लेकिन उन्हें पूरी तरह से खारिज कर दिया है। मैं इसे पूरी प्रक्रिया/AppDomain के लिए पंजीकृत कर लेता हूं, है ना? एक ही प्लगइन इंस्टेंस पर 'निष्पादन()' पर प्रत्येक कॉल अपने आईट्रासिंग सेवा उदाहरण के साथ लाता है और इसे केवल एक ही उदाहरण का उपयोग करने की गारंटी दी जानी चाहिए। जो मैं खोज रहा हूं वह यह सुनिश्चित करने का एक तरीका है कि मेरे अधिकांश रचनाकारों को ऐसे पैरामीटर के साथ प्रदूषित किए बिना जो वास्तव में संबंधित वर्ग के लिए अपना काम करने की आवश्यकता नहीं है। – TeaDrivenDev

+0

मुझे अपने सिर के ऊपर से पता नहीं है, मुझे एमएसडीएन के आसपास खोदना होगा। मैं आपकी परिस्थिति को समझता हूं, मैं अपने सभी कार्यों और वर्गों को लॉगिंग ऑब्जेक्ट्स के चारों ओर गुजर रहा हूं। मैं प्रक्रिया/AppDomain बिट के बारे में एक विचार होगा। –

0

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

धागे आईआईएस के माध्यम से प्रबंधित किए जाते हैं, और यदि संभव हो तो पुन: उपयोग किया जाएगा। इसलिए यदि आप यह सुनिश्चित करना चाहते हैं कि प्रत्येक बार Execute कहा जाता है, तो इसमें एक नया ITracingService है जिसे आपको सेट करना होगा। यदि आप बस यह सुनिश्चित करना चाहते हैं कि प्रत्येक बार Execute कहा जाता है, तो इसमें एक है, आपको इसकी जांच करने के लिए केवल if कथन करने की आवश्यकता होगी।

के बाद से अपने समर्थन चर ThreadStatic है, तो आप सूत्रण मुद्दों के बारे में चिंता करने की जरूरत नहीं है, लेकिन जब से आईआईएस धागे का पुन: उपयोग करने की कोशिश करता है, यह खाली हर बार Execute कहा जाता है नहीं होगा।

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