कॉन्फ़िगर करें (झूठा) ASP.NET कोर में प्रासंगिक है?


100

मैं एक मुद्दे पर ठोकर खाई ( https://github.com/HTBox/allReady/issues/1313) ) GitHub पर जहां उन्होंने ConfigureAwait(false)कोड से बाहर निकालने के बारे में चर्चा की , उन्होंने दावा किया कि, ASP.NET Core में

कॉल ConfigureAwait(false)निरर्थक है और कुछ नहीं करता है

सबसे अच्छा मुझे यहाँ मिल सकता है एक जवाब में "साइड नोट" है (स्टीफन क्लीरी से,) https://stackoverflow.com/a/40220190/2805831 से )

ASP.NET Core में अब "संदर्भ" नहीं है

इसलिए, ASP.NET CoreConfigureAwait(false) में वास्तव में अनावश्यक है (भले ही पूर्ण .Net फ्रेमवर्क का उपयोग कर रहे हों)? क्या इसका कुछ मामलों में प्रदर्शन में वास्तविक लाभ है या परिणाम / शब्दार्थ में अंतर है?

संपादित करें: यदि मैं इसे कंसोल एप्लिकेशन या IIS में होस्ट कर रहा हूं तो क्या यह इस पहलू में भिन्न है?


2
यह इस बात पर निर्भर करता है कि आप इसे कहां इस्तेमाल करने की योजना बना रहे थे। यदि आप इसे सीधे अपने ASP.NET Core अनुप्रयोग में उपयोग करना चाहते हैं, तो नहीं, आपको इसे कॉल करने की आवश्यकता नहीं है (आपको ASP.NET विरासत में इसे न तो कॉल करना होगा और न ही iirc)। लेकिन यदि आप एक पुस्तकालय लिखते हैं, तो आपको हमेशा उपयोग करना चाहिए ConfigureAwait(false), क्योंकि पुस्तकालय का उपयोग विभिन्न अनुप्रयोगों (ASP.NET Core, WPF, UWP, कंसोल आदि) द्वारा किया जा सकता है
Tseng

1
ASP.NET Core डिफ़ॉल्ट रूप से कंसोल एप्लिकेशन के रूप में चलता है, और AFAIK कंसोल एप्लिकेशन में सिंक्रोनाइज़ेशन कॉनटेक्स्ट नहीं है, इसलिए हाँ, यह डिफ़ॉल्ट ASP.NET कोर एप्लिकेशन के लिए उचित लगता है, यहां तक ​​कि पूर्ण फ्रेमवर्क के साथ भी।
जो व्हाइट

@JoeWhite ठीक है, सवाल संपादित किया। यदि मेरा ASP.NET कोर ऐप IIS में है तो क्या यह अलग है?
पेड्रो लोरेंत्ज़

3
IIS में चलने वाला ASP.NET Core ऐप अभी भी कंसोल एप्लिकेशन के रूप में चलता है - केवल अंतर यह है कि IIS आपके ऐप के इंस्टेंस को शुरू कर रहा है और बंद कर रहा है (उसी तरह इसमें ASP.NET वर्कर प्रक्रिया के इंस्टेंस को प्रबंधित करना होगा। क्लासिक ASP.NET)। यह आपके ASP.NET ऐप के अंदर किसी भी थ्रेड-संबंधित व्यवहार को नहीं बदलेगा। (एकमात्र कारण जो मैंने "डिफ़ॉल्ट रूप से" निर्दिष्ट किया है, वह यह है कि आप उदाहरण के लिए, एएसयू.नेट कोर को एक जीयूआई ऐप के अंदर होस्ट कर सकते हैं, और उस स्थिति में आपको सिंक्रनाइज़ेशन संदर्भ के बारे में सोचना होगा ।)
जो व्हाइट

ध्यान दें ConfigureAwait(false), जबकि ASP.NET क्लासिक में प्रासंगिक , किसी भी तरह से आवश्यक नहीं है । यह एक ट्रेडऑफ़ है: यह थोड़े सिंक-ओवर-एसिंक्स डेडलॉक को कम करता है (जो कि वैसे भी डिजाइन दोष हैं - वे तब तक मौजूद नहीं होते हैं जब तक कि कोई कुछ गूंगा नहीं करता) और कभी-कभी संदर्भ को पुनः लोड नहीं करके ~ माइक्रोसेकंड प्रदर्शन को बढ़ावा देता है। संदर्भ पर और ConfigureAwaitअपने कोड के माध्यम से सभी पर निर्भर नहीं होने की कीमत पर । stackoverflow.com/questions/28221508/…
Dax Fohl

जवाबों:


105

ConfigureAwaitकेवल उस कोड पर प्रभाव पड़ता है SynchronizationContextजिसके संदर्भ में ASP.NET Core के पास नहीं है (ASP.NET "लिगेसी" करता है)।

सामान्य प्रयोजन कोड को अभी भी इसका उपयोग करना चाहिए क्योंकि यह एक के साथ चल सकता है SynchronizationContext

ASP.NET कोर सिंक्रोनाइज़ेशन कॉनटेक्स्ट


17
बस एक मामूली स्पष्टीकरण रखना चाहते हैं, एक गैर कोर वातावरण में ASP.NET एक सिंक संदर्भ है, लेकिन ASP.NET कोर नहीं है।
स्कॉट चैंबरलेन

@Morgado, क्या यह सच है भले ही ऐप को IIS में होस्ट किया गया हो?
पेड्रो लोरेंत्ज़

7
IIS में ASP.NET Core ऐप होस्ट नहीं किया गया है। IIS एक विपरीत प्रॉक्सी के रूप में कार्य कर रहा है।
पाउलो मोरागडो

2
मैंने स्टीफन क्लीरी के एक हालिया पोस्ट के साथ उत्तर को अपडेट किया है। लेकिन, हां, ASP.NET Core ASP.NET Core है।
पाउलो मोरागडो

14
@NamNgo। सराहना करें यह अब एक पुरानी पोस्ट है लेकिन स्टीफन क्ली ने पोस्ट पर एक प्रश्न में यह स्पष्ट किया है कि पाउलो ने ऊपर लिंक किया था। "यह फ्रेमवर्क है (ASP.NET Classic के विपरीत ASP.NET Core) जो सिंक्रोनाइज़ेशन कॉन्टेक्स्ट को निर्धारित करता है, रनटाइम को नहीं। (.NET Core को .NET 4.6.2 के विपरीत)"
गेविन सदरलैंड

14

इस बारे में क्या?

इस समय (फरवरी -२०२०) एमएस ब्लॉग पर डेवलपर्स प्रदर्शन को बेहतर बनाने, गतिरोध से बचने के लिए कन्फिगरएविट (गलत) का उपयोग करने की सलाह देते हैं। https://devblogs.microsoft.com/dotnet/configureawait-faq/

मैंने सुना है कि कॉन्फ़िगर कॉन्फ़िगर (झूठा) अब .NET कोर में आवश्यक नहीं है। सच? असत्य। .NET कोर पर चलते समय ठीक उसी कारणों से .NET कोर पर चलते समय इसकी आवश्यकता होती है। उस संबंध में कुछ भी नहीं बदला है।


यदि कुछ उपयोगकर्ता कोड (या अन्य पुस्तकालय कोड जो आपके ऐप का उपयोग कर रहा है) एक कस्टम संदर्भ सेट करता है और आपके कोड को कॉल करता है, या कस्टम टास्कसुकुलर के लिए निर्धारित टास्क में अपने कोड को आमंत्रित करता है, तो ASP.NET कोर में भी आपका इंतजार गैर देख सकता है- डिफ़ॉल्ट संदर्भ या शेड्यूलर जो आपको कॉन्फ़िगरविआइट (झूठा) का उपयोग करना चाहते हैं। बेशक, ऐसी स्थितियों में, यदि आप सिंक्रोनाइज़िंग ब्लॉकिंग से बचते हैं (जो आपको बिना परवाह किए वेब एप्स में करने से बचना चाहिए) और अगर आपको इस तरह की सीमित घटनाओं में छोटे प्रदर्शन की ज़रूरत नहीं है, तो आप शायद कॉन्फिगरएविट (गलत) का उपयोग किए बिना दूर हो सकते हैं ।
Alisson

1
उस के अनुसार, मैं उन अधिकांश मामलों के लिए कहूँगा जिनकी आवश्यकता नहीं है। जब तक आप एक कस्टम सिंक्रनाइज़ेशन संदर्भ का उपयोग कर रहे हैं या ऐसा करने वाले पुस्तकालय का उपयोग नहीं कर रहे हैं।
Alisson
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.