2010-04-11 15 views

उत्तर

4

यह क्रिस्टल मेरे लिए स्पष्ट अब तक MSDN प्रलेखीकरण से नहीं है, लेकिन मैं एक forum post from someone who claims to know the answer पाया। ऐसा लगता है कि आपको खराब सामग्री आपके कार्यान्वयन के साथ होने की उम्मीद नहीं करनी चाहिए, लेकिन आपको अवगत होना चाहिए कि foo का राज्य सभी परिणामों में साझा नहीं किया जाएगा क्योंकि HttpModule प्रति HttpApplication पर एक बार बनाया जाएगा कि आईआईएस रखने के लिए चुनता है अपने पूल में

+0

हां, यह कई अलग-अलग अनुरोधों के बीच उदाहरण का पुन: उपयोग करता है। लेकिन सवाल यह है कि क्या यह विभिन्न धागे के बीच उदाहरण का पुन: उपयोग करता है। –

+1

जो मैं कह सकता हूं: हाँ, लेकिन एक ही समय में नहीं। एक अनुरोध आवेदन की अवधि के लिए दिए गए अनुरोध को एक Http आवेदन सौंपा गया प्रतीत होता है। – sblom

+0

ठीक है, धन्यवाद। मैं तब तक इंतजार करूंगा जब तक कोई यह नहीं जानता कि यह वास्तव में पुष्टि करता है, क्योंकि मैं उस कोड का उत्पादन वातावरण में उपयोग करूंगा, और मुझे डीबग करना मुश्किल होगा। –

1

मैं हाल ही में एक लेख जो थोड़ा इस प्रश्न पर छू लेती है पाया: http://www.dominicpettifer.co.uk/Blog/41/ihttpmodule-gotchas---the-init---method-can-get-called-multiple-times

यह सूत्र का उल्लेख नहीं है, लेकिन केवल का कहना है कि वर्कर प्रोसेस होगा

इन्स्तांत के रूप में कई HttpApplication वस्तुओं के रूप में ऐसा लगता है कि इसकी आवश्यकता है, तो यह उन्हें कारणों के लिए पूल करेगा, उदाहरणों का पुन: उपयोग करने के रूप में नए अनुरोध पूल में वापस भेजने से पहले अनुरोध करते हैं।

private static bool HasAppStarted = false; 
private readonly static object _syncObject = new object(); 

public void Init(HttpApplication context) 
{ 
    if (!HasAppStarted) 
    { 
     lock (_syncObject) 
     { 
      if (!HasAppStarted) 
      { 
       // Run application StartUp code here 

       HasAppStarted = true; 
      } 
     } 
    } 
} 

मैं एक परीक्षण ऐप को स्थापित करने के लिए किया गया है, जिसका अर्थ है:

लिंक से में कोड के बाद, आप सुनिश्चित करें कि आपके init कोड एक धागा सुरक्षित तरीके से एक बार निष्पादित किया जाता है हो सकता है इसे चलाने और इसे जांचने के लिए, यह देखने के लिए कि क्या यह सच है, लेकिन मेरे पास समय नहीं है।

+0

आपके उत्तर के लिए धन्यवाद। यह जांचता है कि अब इसे साझा किया गया है या नहीं। मुझे इसे बिल्कुल जानने की ज़रूरत है, क्योंकि जैसा कि मैंने उपरोक्त देखा है, मैं उत्पादन वातावरण में इसका उपयोग करूंगा और यह बदले में वास्तव में दर्दनाक होगा, उदाहरण के लिए .NET Framework या IIS के कुछ अपडेट के दौरान। –

1

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

मुझे लगता है कि यदि आप स्थैतिक सदस्यों को प्रारंभ कर रहे हैं या "केवल एक बार" प्रारंभिक प्रदर्शन कर रहे हैं यानी स्थिर संसाधन शुरू करना चाहते हैं तो आपको केवल लॉक तंत्र की आवश्यकता होगी।

मैं एमएसडीएन से निष्कर्ष निकाला नहीं जा सका और न ही जिम द्वारा वर्णित लेख जिसे हमें गैर स्थैतिक वर्ग चर शुरू करने के दौरान लॉक तंत्र की आवश्यकता है।

1

मैं के रूप में मैं IIS6 में देखा है यहाँ इस प्रश्न से संबंधित मेरे निष्कर्ष की पेशकश करना चाहता था:

मैं IIS6 में बड़े पैमाने पर इस मुद्दे के साथ काम कर दिया है और कुछ रोचक परिणाम log4net और प्रतिबिंब का उपयोग निष्पादन इतिहास पर कब्जा करने के पाया है । जो मैंने पाया है वह है कि दृश्यों के पीछे व्यापक 'धागा प्रबंधन' चल रहा है। ऐसा लगता है कि थ्रेड की 'प्राथमिक' श्रृंखला है जो 1: 1 से HttpApplication से मेल खाती है। हालांकि ये थ्रेड आपके अनुरोध के लिए पाइपलाइन को विशेष रूप से संभाल नहीं पाते हैं। विभिन्न उदाहरणों को एक्सेस किए जाने पर विभिन्न विभिन्न उप-धागे कह सकते हैं। आपके आवेदन द्वारा उपयोग किए जाने वाले बाद के नए अनुरोध और संसाधन अनुरोध आपके मूल अनुरोध से संबंधित कुछ लगातार जानकारी साझा करते हैं, लेकिन अभी तक प्रारंभिक धागे से कुछ प्रकार के रिश्तों को इंगित करने वाले पूरी तरह से संभाले नहीं जाते हैं। मैं किसी भी ठोस पैटर्न (जो मैंने पहले वर्णित किया है उसके अलावा) को नहीं समझ सका क्योंकि किस तत्व को अन्य धागे में विभाजित किया गया था क्योंकि यह प्रतीत होता है कि यह यादृच्छिक था। इस सबूत के लिए मेरा निष्कर्ष यह है कि पदानुक्रमित पूलिंग की कुछ अवधारणा है? ऐसा होता है जहां संदर्भ तत्वों के कुछ अज्ञात सबसेट माता-पिता संदर्भ में बाल धागे में विरासत में प्राप्त होते हैं।

तो एक उत्तर के रूप में मैं कहूंगा कि HttpModules धागे के बीच साझा किया गया है। उदाहरण मान लॉक करने के मामले में, यह लागू होगा यदि मान मॉड्यूल का उपयोग करने वाले सभी अनुरोधों पर लागू होते हैं और कुछ राज्य बनाए रखना चाहिए। मैं यह उपयोगी साबित कर सकता हूं अगर राज्यव्यापी उदाहरण मूल्यों को बनाए रखने का प्रयास किया जा रहा है जो कि यह सुनिश्चित करने के लिए महंगा है ताकि उन्हें बाद के अनुरोधों में पुन: उपयोग किया जा सके।

यह समस्या मुझे कुछ समय के लिए परेशान कर रही थी उम्मीद है कि यह जानकारी किसी की मदद करेगी।

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