अद्यतन: ASP.NET Core में a नहीं हैSynchronizationContext
। यदि आप ASP.NET Core पर हैं, तो इससे कोई फर्क नहीं पड़ता कि आप उपयोग करते हैं ConfigureAwait(false)
या नहीं।
ASP.NET "पूर्ण" या "क्लासिक" या जो भी हो, इस उत्तर के बाकी अभी भी लागू होते हैं।
मूल पोस्ट (नॉन-कोर ASP.NET के लिए):
ASP.NET टीम के इस वीडियो में ASP.NET का उपयोग async
करने की सबसे अच्छी जानकारी है ।
मैंने पढ़ा था कि यह अधिक अच्छा है क्योंकि इसे मूल संदर्भ के लिए थ्रेड संदर्भों को वापस स्विच करने की आवश्यकता नहीं है।
यह यूआई अनुप्रयोगों के साथ सच है, जहां केवल एक यूआई धागा है जिसे आपको वापस "सिंक" करना है।
ASP.NET में, स्थिति थोड़ी अधिक जटिल है। जब कोई async
विधि निष्पादन शुरू करती है, तो वह ASP.NET थ्रेड पूल से एक थ्रेड पकड़ती है। यदि आप संदर्भ कैप्चर का उपयोग करके अक्षम करते हैं ConfigureAwait(false)
, तो थ्रेड सीधे विधि को निष्पादित करना जारी रखता है। यदि आप संदर्भ कैप्चर को अक्षम नहीं करते हैं, तो धागा अनुरोध के संदर्भ में फिर से प्रवेश करेगा और फिर विधि को निष्पादित करना जारी रखेगा।
तो ConfigureAwait(false)
ASP.NET में आपको थ्रेड जंप नहीं बचाता है; यह आपको अनुरोध के संदर्भ में फिर से प्रवेश करने से बचाता है, लेकिन यह सामान्य रूप से बहुत तेज है। यदि आप एक अनुरोध के समानांतर प्रसंस्करण की एक छोटी राशि करने की कोशिश कर रहे हैं, तो उपयोगी ConfigureAwait(false)
हो सकता है, लेकिन वास्तव में TPL उन परिदृश्यों के लिए एक बेहतर फिट है।
हालाँकि, ASP.NET वेब एपी के साथ, यदि आपका अनुरोध एक थ्रेड पर आ रहा है, और आप कुछ फ़ंक्शन का इंतजार करते हैं और ConfigureAwait (गलत) कॉल करते हैं, जो संभावित रूप से आपको एक अलग थ्रेड पर डाल सकता है जब आप अपने ApiChroller फ़ंक्शन का अंतिम परिणाम लौटा रहे हैं। ।
असल में, सिर्फ एक await
कर सकते हैं कि कर सकते हैं। एक बार जब आपकी async
विधि हिट हो जाती है await
, तो विधि अवरुद्ध हो जाती है, लेकिन थ्रेड थ्रेड पूल में वापस आ जाता है। जब विधि जारी रखने के लिए तैयार होती है, तो किसी भी धागे को थ्रेड पूल से छीन लिया जाता है और विधि को फिर से शुरू करने के लिए उपयोग किया जाता है।
ConfigureAwait
ASP.NET में एकमात्र अंतर यह है कि क्या विधि को फिर से शुरू करते समय थ्रेड अनुरोध संदर्भ में प्रवेश करता है।
मेरे और मेरे परिचय ब्लॉग पोस्ट परSynchronizationContext
मेरे MSDN लेख में पृष्ठभूमि की अधिक जानकारी है ।async
HttpContext.Current
ASP.NET द्वारा प्रवाहित किया जाता हैSynchronizationContext
, जिसे डिफ़ॉल्ट रूप से आपके द्वारा प्रवाहित किया जाता हैawait
, लेकिन यह इसके द्वारा प्रवाहित नहीं होता हैContinueWith
। OTOH, निष्पादन संदर्भ (सुरक्षा प्रतिबंधों सहित) संदर्भ के माध्यम से सी # CLR में उल्लेख किया है, और यह है दोनों से प्रवाहित होतीContinueWith
है औरawait
(भले ही आप का उपयोगConfigureAwait(false)
)।