2012-09-02 13 views
7

जब हम एएसपी.नेट वेब एपीआई में कुछ एक्स्टेंसिबिलिटी पॉइंट्स से निपट रहे हैं, तो हम टीएपी (टास्क-आधारित प्रोग्रामिंग पैटर्न) से भी निपटते हैं। कुछ बिंदुओं पर, हम ContinueWith के साथ एसिंक विधि को निरंतर प्रदान करना चाहते हैं और हम प्रतिनिधि के अंदर कुछ सामान करते हैं जिसे हम ContinueWith पर पास करते हैं।सिंक्रनाइज़ेशन कॉन्टेक्स्ट और एएसपी.नेट वेब एपीआई एक्सटेंसिबिलिटी पॉइंट्स

ब्रैड विल्सन ने गहराई से here समझाया कि जब हम निरंतरता प्रदान करते हैं तो सिंक्रनाइज़ेशन कॉन्टेक्स्ट महत्वपूर्ण है। मेरे लिए, एकमात्र जगह जहां मुझे SynchronizationContext पर एएसपी.NET वेब एपीआई में वापस जाने की आवश्यकता है वह जगह है जहां मुझे HttpContext.Current (जो कुछ है जो मैं कभी भी एएसपी.नेट वेब एपीआई एप्लिकेशन में नहीं करता) के साथ खेलना चाहता हूं और वह जगह जहां मुझे Thread.CurrentPrincipal जैसे थ्रेड के लिए कुछ जानकारी सेट करने की आवश्यकता है।

तो सवाल यह है कि: क्या हम कभी भी SynchronizationContext पर वापस जाना चाहते हैं जब हम संदेश हैंडलर, फ़िल्टर, फॉर्मेटर्स इत्यादि जैसे कुछ विस्तारशील बिंदुओं में निरंतरता प्रदान करते हैं?

उत्तर

2

उत्तर लगभग हमेशा हाँ है।

यह कहना नहीं है कि आप हमेशा सिंक्रनाइज़ेशन संदर्भ का उपयोग करते हैं, लेकिन संदेश हैंडलर, फ़िल्टर और स्वरूपक की प्रकृति को देखते हुए, आप भविष्यवाणी नहीं कर सकते कि उन्हें उपयोग की आवश्यकता होगी या नहीं HttpContextBase तक पहुंचने के लिए SynchronizationContext

भी फिल्टर, जहाँ आप कुछ है कि आप HttpContext तक पहुँच देता है पारित कर दिया तो उस संबंध में

(एक IActionFilter implementation के माध्यम से कहते हैं), कि HttpContext अंततः धागे पर वर्तमान CallContext को देखने के लिए कि उदाहरण से जानकारी प्रदान करने के लिए जा रहा है। चूंकि वर्तमान थ्रेड (async चलाते समय) उस पर उस जानकारी नहीं है जब आपने Task प्रारंभ किया था, तो वे कॉल विफल हो जाएंगी।

ने कहा कि यही कारण है कि आप अनुरोध के साथ जुड़े HttpContextBase के लिए सामान्य, निरंकुश उपयोग की जरूरत है, तो आप बिल्कुल यह तक पहुँचने के लिए SynchronizationContext के आसपास पारित करने के लिए होगा अगर।

हालांकि, यदि संभव हो तो, आप विवरण HttpContextBase कि आप की आवश्यकता केकॉपी चाहिए, और पारित कि चारों ओर; यदि आप कुछ सामान्यीकृत लिख रहे हैं, तो यह संभव नहीं होगा।

+0

उत्तर के लिए धन्यवाद! मुझे लगता है कि आपने एएसपी.नेट एमवीसी के साथ सवाल मिश्रित किया है। आइए मान लें कि आप एएसपी.नेट होस्ट के अंतर्गत नहीं हैं। फिर, आपके पास HttpContext नहीं होगा। इसलिए, विस्तारशीलता बिंदु उन लोगों के साथ कसकर नहीं मिलते हैं। – tugberk

+0

@tugberk उत्तर अभी भी वही है, वास्तव में; यदि आपके पास किसी विशेष संदर्भ से जुड़ा हुआ कुछ है, और फिर एसिंक जाना चाहते हैं, तो आप वास्तव में संदर्भ से मूल्यों की प्रतिलिपि बनाना सुनिश्चित करना चाहते हैं (या सुनिश्चित करें कि आप * संदर्भ में वापस * पहुंच प्राप्त कर सकते हैं) कि आप प्रसंस्करण की आवश्यकता होगी। – casperOne

+0

समस्या यह है कि: वेब एपीआई में, आपके पास लगभग कोई संदर्भ नहीं है। आप थ्रेड के माध्यम से किए गए वेरिएबल्स के अंदर संदर्भ कर सकते हैं + फ्रेमवर्क आधारभूत संरचना हमेशा आपको सिंक संदर्भ में वापस ले जाती है यदि आप स्रोत कोड देखते हैं। यही कारण है कि आपका उत्तर लागू नहीं है। – tugberk

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