2009-10-13 15 views
12

तो मैं सोच रहा हूं कि एएसपीनेट एक स्थैतिक संपत्ति का दायरा कैसे सक्षम कर सकता है, जब (मेरे ज्ञान के लिए) asp.net बहु-थ्रेडेड होता है।HttpContext.Current एक बहु थ्रेडेड वातावरण में कैसे काम करता है?

  • एक सिद्धांत यह है कि एएसपी.नेट लोग प्रत्येक अनुरोध के लिए एक अलग अपडोद बनाए रखते हैं ... लेकिन यह व्यवहार्य प्रतीत नहीं होता है।
  • एक और सिद्धांत यह है कि वर्तमान विधि वर्तमान थ्रेड को देखती है, और उसके बाद कुछ हैशटेबल (या अन्य स्थिर स्टोरेज तंत्र) में http संदर्भ देखने के लिए इसका उपयोग करती है।

किसी भी तरह से, यह एक तकनीक है कि वास्तव में उपयोगी लगता है ... मैं इसे का उपयोग करना चाहते हैं, लेकिन निश्चित रूप से साझा राज्य कीड़े डिबगिंग जा नहीं करना चाहती: -/

उत्तर

8

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

तो समाधान वास्तव में बहुत दुखद नहीं है, जहां थ्रेडस्टैटिक बहुत आसान है और शायद सूट के लिए 95% समय की आवश्यकता है।

15

ऐसा नहीं है प्रति AppDomain प्रति-अनुरोध। आप धागे की विशिष्ट राज्य का उपयोग करना चाहते हैं, तो कोशिश:

[ThreadStatic] 
private static int foo; 
public static int Foo {get {return foo;} set {foo = value;}} 

प्रत्येक धागा अब Foo का अपना ही मूल्य (: 'foo' या बल्कि) हो जाता है।

यह हल्का उपयोग करने के लिए नहीं है - इसकी लागत होती है, लेकिन प्रति-थ्रेड आधार पर राज्य साझा करने का एक वैध तरीका है। मैंने इसे एक बार इस्तेमाल किया है, शायद दो बार - और मैंने बहुत सी सी # लिखा है। इस पर-उपयोग न करें ...

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

+0

भयानक, इसके लिए धन्यवाद ... थ्रेड मरने के बाद स्थैतिक उदाहरण साफ हो जाता है? –

+3

यह ध्यान रखना महत्वपूर्ण है कि थ्रेडस्टैटिक उच्च-लोड परिदृश्य में विश्वसनीय नहीं है। ASP.NET थ्रेड के बीच अनुरोध संदर्भ स्विच करता है और HttpContext माइग्रेट करता है। किसी भी [थ्रेडस्टैटिक] पुराने धागे पर पीछे छोड़ दिया जाएगा, जो एक नया अनुरोध उठा रहा है। –

+0

दिलचस्प सवाल ... विशेष रूप से यदि यह एक पूल धागा है जिसका पुन: उपयोग किया जा सकता है ;- मेरी सलाह: यदि आप इस तरह की चीज कर रहे हैं तो मैन्युअल रूप से साफ करें। –

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