2012-05-11 54 views
5

की जांच के बाद खुद को नल करता है मुझे आज एक अजीब समस्या का सामना करना पड़ा जो मुझे कोई समझ नहीं आया। यहाँ एक सारांश है:System.Web.HttpContext.Current एक कैश

एक विधि के अंदर, मैं नीचे के रूप में एक कैश्ड आइटम के लिए जाँच:

private async Task<RatesStatus> getRatesStatusAsync() { 

    //... 

    if (_currentHttpContext != null) { 

     //Here, I am checking for a Cached item 
     var cachedRatesStatusObj = HttpContext.Current.Cache[Constants.RATESSTATUS_CACHE_KEY_NAME]; 
     if (cachedRatesStatusObj != null) 
      return (RatesStatus)cachedRatesStatusObj; 
    } 

    //... 

    cacheRatesStatusObject(ratesStatus); 

    //... 
} 

यहाँ, HttpContext.Current ASP.NET अनुप्रयोग के अंदर की उम्मीद के रूप में अशक्त नहीं है। फिर, cacheRatesStatusObject विधि के अंदर, मैं जाँच अगर HttpContext.Current अशक्त या नीचे के रूप में नहीं है:

private void cacheRatesStatusObject(RatesStatus ratesStatus) { 

    //... 

    //Seeing if HttpContext.Current is null or not first. 
    //and it is null here... 
    if (HttpContext.Current == null) 
     return; 

    //... 
} 

और यह वहाँ रिक्त है। कोई विचार नहीं कि यहाँ क्या हो रहा है। कोई विचार?

+1

मैं अपने विधि 'चिह्नित है async' का उल्लेख किया। बस यह सुनिश्चित करने के लिए, जहां भी आप इस विधि को बुला रहे हैं, आप 'प्रतिक्रिया' ग्राहक को वापस भेज दिए जाने से पहले कहीं भी 'प्रतीक्षा' कर रहे हैं और बंद कर दिया है, है ना? अन्यथा यह केवल दौड़ की स्थिति हो सकती है, जहां 'रेस्पॉन्स' वापस लौटाया जा रहा है और इस लाइन पर जाने से पहले निपटान किया जा रहा है, लेकिन अभी भी ऊपर की रेखा पर उपलब्ध है। –

+0

@GuthMD हां, मैंने विधि के अंदर कहीं भी 'प्रतीक्षा' किया था। यह समस्या होनी चाहिए। – tugberk

उत्तर

4

जब आप async/await का उपयोग करते हैं, तो अनुरोध को संभालने वाला थ्रेड अपूर्ण के रूप में अनुरोध करता है और फिर ASP.NET thread pool पर वापस आता है। जब प्रतीक्षा करने योग्य बाद में पूरा हो जाता है, तो बाकी थ्रेड को चलाने के लिए एक और धागा आवंटित किया जाता है, हालांकि HttpContext थ्रेड में माइग्रेट नहीं किया जाता है, यही कारण है कि प्रतीक्षा विधि को कॉल करते समय आपको शून्य संदर्भ मिलता है।

await cacheRatesStatusObject(HttpContext.Current, ratesStatus); 

लेकिन अगर आप उदाहरण के लिए, बहुत सावधान संगामिति और दौड़ की स्थिति से निपटने होना चाहिए इंतजार धागा एक संसाधन ताले यदि:

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

+0

असल में 'HttpContext.Current' प्रतीक्षा के बाद शून्य नहीं है। यह एसिंक विधि में केवल शून्य है। यह प्रश्न देखें: http://aspnetwebstack.codeplex.com/discussions/359012 – Aliostad

0

यह खुद को शून्य नहीं करता है।

HttpContext केवल 'थ्रेड स्थैतिक' तरीके से संग्रहीत है।

जैसा कि दूसरे उत्तर से सुझाया गया है, बस उदाहरण को पास करें।

+0

हाँ, मैंने बस इसे समझ लिया। मुझे एसिंक कॉल से पहले इसका एक उदाहरण मिलता है: 'var httpContext = HttpContext.Current;' बाद में प्रक्रिया में, मैं इस स्थानीय चर के साथ काम करता हूं। – tugberk

+0

यह ज्यादा समझ में नहीं आता है। धागा संदर्भ क्यों कॉपी नहीं किया जाता है ?? – Aliostad

+0

@Aliostad: यह वही तरीका है जो यह काम करता है। अन्य अनुरोधों की सेवा करने वाले अन्य धागे एक ही राज्य साझा करेंगे। – leppie