दिलचस्प पोस्ट
जावा लॉजिकल ऑपरेटर शॉर्ट सर्किटिंग कस्टम केस क्लास का डेटासेट बनाते समय "डेटासेट में संग्रहीत प्रकार के लिए एन्कोडर खोजने में असमर्थ क्यों है"? यूडीपी ब्रॉडकास्ट का उपयोग करके नेटवर्क खोज कैसे करें कब सी में एक वैश्विक चर का उपयोग करना ठीक है? जावास्क्रिप्ट – तिथि प्रारूप को मान्य करने के लिए रेगेक्स सीतनिद्रा में होना: कैसे मैप सुपर वर्ग से एक विशेषता को ओवरराइड ऑटो वृद्धि SQL फ़ंक्शन एक उपयोगकर्ता के ब्राउज़र प्रदर्शित कर सकते हैं हर फ़ॉन्ट की सूची गीत में FETCH_HEAD क्या मतलब है? क्या मैं एक ही तत्व के लिए छद्म तत्वों से पहले एकाधिक हो सकता हूं? EOFException – कैसे संभालना है? क्या कोई मैप की व्याख्या कर सकता है सीतनिद्रा में? java.rmi.ConnectException: कनेक्शन होस्ट करने से इनकार कर दिया गया: 127.0.1.1; कॉलबैक जब निर्भरता संपत्ति को एक्सएमएल परिवर्तन प्राप्त होता है भ्रामक पायथन में सूची: यह क्या है?

सभी सर्वर-साइड कोड के लिए ConfigureAwait को कॉल करने के लिए सर्वोत्तम अभ्यास

जब आपके पास सर्वर-साइड कोड है (यानी कुछ ApiController ) और आपके फ़ंक्शन एसिंक्रोनस हैं – तो वे Task<SomeObject> वापस Task<SomeObject> – क्या यह सबसे अच्छा अभ्यास माना जाता है कि जब भी आप ConfigureAwait(false) कॉल ConfigureAwait(false)

मैंने पढ़ा था कि यह अधिक निष्पादक है क्योंकि इसमें थ्रेड संदर्भों को वापस मूल धागा संदर्भ पर स्विच करना नहीं है हालांकि, एएसपी.नेट वेब एपीआई के साथ, यदि आपका अनुरोध एक धागा पर आ रहा है, और आप कुछ फ़ंक्शन का इंतजार कर रहे हैं और ConfigureAwait(false) कॉल कर सकते हैं, जो संभवतः आप अपने ApiController समारोह का अंतिम परिणाम ।

मैंने नीचे के बारे में क्या बात कर रहा हूँ इसका उदाहरण दिया है:

 public class CustomerController : ApiController { public async Task<Customer> Get(int id) { // you are on a particular thread here var customer = await SomeAsyncFunctionThatGetsCustomer(id).ConfigureAwait(false); // now you are on a different thread! will that cause problems? return customer; } } 

Solutions Collecting From Web of "सभी सर्वर-साइड कोड के लिए ConfigureAwait को कॉल करने के लिए सर्वोत्तम अभ्यास"

अद्यतन: एएसपी.NET कोर में एक SynchronizationContext नहीं है । यदि आप एएसपी.नेट कोर पर हैं, तो इससे कोई फर्क नहीं पड़ता कि आप ConfigureAwait(false) उपयोग करते हैं या नहीं।

एएसपी.नेट "पूर्ण" या "क्लासिक" के लिए या जो भी हो, बाकी का उत्तर अब भी लागू होता है।

मूल पोस्ट (गैर कोर ASP.NET के लिए):

एएसपी.नेट टीम द्वारा इस वीडियो में एएसपी.नेट पर async का उपयोग करने के बारे में सबसे अच्छी जानकारी है।

मैंने पढ़ा था कि यह अधिक निष्पादक है क्योंकि इसमें थ्रेड संदर्भों को वापस मूल धागा संदर्भ पर स्विच करना नहीं है

यह यूआई ऐप्लिकेशन के साथ सच है, जहां केवल एक ही यूआई थ्रेड है जिसे आपको "सिंक" वापस करना है

एएसपी.नेट में, स्थिति थोड़ा और जटिल है जब एक async विधि को निष्पादन शुरू होता है, यह ASP.NET थ्रेड पूल से एक थ्रेड को पकड़ लेता है। यदि आप ConfigureAwait(false) का उपयोग करते हुए संदर्भ कैप्चर को अक्षम करते हैं, तो धागा सीधे विधि को क्रियान्वित करता है। यदि आप संदर्भ कैप्चर को अक्षम नहीं करते हैं, तो थ्रेड अनुरोध के संदर्भ में फिर से प्रवेश करेगा और फिर विधि निष्पादित करना जारी रखेगा।

तो ConfigureAwait(false) आप ASP.NET में एक धागा कूद नहीं बचा है; यह आपको अनुरोध संदर्भ के पुन: प्रवेश की बचत करता है, लेकिन यह सामान्य रूप से बहुत तेज है ConfigureAwait(false) उपयोगी हो सकता है यदि आप एक अनुरोध के समानांतर संसाधन की थोड़ी मात्रा में करने की कोशिश कर रहे हैं, लेकिन वास्तव में उन अधिकांश परिदृश्यों के लिए वास्तव में टीपीएल एक बेहतर फिट है

हालांकि, एएसपी.नेट वेब एपीआई के साथ, यदि आपका अनुरोध एक धागा पर आ रहा है, और आप कुछ फ़ंक्शन का इंतजार कर रहे हैं और कॉन्फ़िगरएवाइट (झूठी) को कॉल कर सकते हैं, जो संभवतः आप अपने एपीआई नियंत्रक समारोह का अंतिम परिणाम ।

दरअसल, बस एक await कर ऐसा कर सकता है एक बार जब आपके async विधि का await , तो विधि अवरुद्ध हो जाती है लेकिन थ्रेड थ्रेड पूल में वापस आ जाता है। जब विधि जारी रखने के लिए तैयार होती है, तो कोई थ्रेड थ्रेड पूल से छीन लिया जाता है और विधि को फिर से शुरू करने के लिए इस्तेमाल किया जाता है।

केवल अंतर ConfigureAwait ASP.NET में बनाता है कि क्या वह धागा अनुरोध को संदर्भ में प्रवेश करती है जब विधि फिर से शुरू होता है।

मेरे async और मेरे async परिचय ब्लॉग पोस्ट पर मेरे एमएसडीएन लेख में अधिक पृष्ठभूमि जानकारी है I

आपके प्रश्न का संक्षिप्त उत्तर: नहीं। आपको ConfigureAwait(false) को इस तरह के अनुप्रयोग स्तर पर कॉल नहीं करना चाहिए।

टीएल; लंबे समय से उत्तर के डीआर संस्करण: यदि आप एक पुस्तकालय लिख रहे हैं जहां आप अपने उपभोक्ता को नहीं जानते हैं और आपको सिंक्रनाइज़ेशन प्रसंग की आवश्यकता नहीं है (जो कि मुझे विश्वास है कि आपको लाइब्रेरी में नहीं होना चाहिए), तो आपको हमेशा ConfigureAwait(false) उपयोग करना चाहिए ConfigureAwait(false) अन्यथा, आपकी लाइब्रेरी के उपभोक्ताओं को अवरुद्ध फैशन में अपने अतुल्यकालिक तरीकों का उपयोग करके डेडलॉक का सामना करना पड़ सकता है। यह स्थिति पर निर्भर करता है।

यहाँ ConfigureAwait विधि (मेरे ब्लॉग पोस्ट से उद्धरण) के महत्व पर थोड़ा और अधिक विस्तृत विवरण दिया गया है:

जब आप खोजशब्द के इंतजार के साथ एक विधि की प्रतीक्षा कर रहे हों, तो कंपाइलर आपके लिए आपकी ओर से कोड का गुच्छा उत्पन्न करता है इस क्रिया के प्रयोजनों में से एक को UI (या मुख्य) थ्रेड के साथ सिंक्रनाइज़ेशन को संभालना है इस सुविधा का मुख्य घटक सिंक्रनाइज़ेशन कंसोर्ट। वर्तमान है जो वर्तमान थ्रेड के लिए सिंक्रनाइज़ेशन प्रसंग प्राप्त करता है। SynchronizationContext.Current GetAwaiter । वर्तमान में आप जिस परिवेश में हैं, उसके आधार पर पॉपुलेट किया जाता है। कार्य की GetAwaiter विधि SynchronizationContext.Current GetAwaiter । के लिए दिखती है। यदि वर्तमान सिंक्रनाइज़ेशन संदर्भ रिक्त नहीं है, तो उस प्रतीक्षाकर्ता को जारी किए जाने की निरंतरता उस सिंक्रनाइज़ेशन प्रसंग पर वापस पोस्ट की जाएगी।

एक विधि का उपयोग करते समय, जो नई अतुल्यकालिक भाषा सुविधाओं का उपयोग करता है, एक अवरुद्ध फैशन में, यदि आप एक उपलब्ध सिंक्रनाइज़ेशन कंटेंस्टेक्स है, तो आप डेडलॉक के साथ समाप्त हो जाएंगे। जब आप एक अवरुद्ध फैशन में ऐसे तरीकों का उपभोग कर रहे हैं (कार्य की प्रतीक्षा के साथ कार्य पर कार्य की प्रतीक्षा कर रहे हैं या कार्य के परिणाम की संपत्ति से सीधे परिणाम निकालना), तो आप एक ही समय में मुख्य थ्रेड को अवरुद्ध कर देंगे। जब अंततः कार्य को थ्रेडपूल में उस पद्धति के अंदर पूर्ण किया जाता है, तो यह मुख्य थ्रेड को वापस पोस्ट करने के लिए निरंतरता का आह्वान करने जा रहा है क्योंकि SynchronizationContext.Current कंटेंट। वर्तमान उपलब्ध है और कैप्चर किया गया है। लेकिन यहां एक समस्या है: UI थ्रेड अवरुद्ध है और आपके पास एक गतिरोध है!

इसके अलावा, यहां आपके लिए दो महान लेख दिए गए हैं जो आपके प्रश्न के लिए ठीक हैं:

  • पैर में अपने आप को शूट करने के लिए बिल्कुल सही नुस्खा – सी # 5.0 का उपयोग करने वाले एक डेडलॉक के साथ समाप्त हो रहा है। अतुल्यकालिक भाषा की विशेषताएं
  • आपकी HTTP एपीआई के लिए एसिंक्रोनस .नेट क्लाइंट लाइब्रेरी और एसिंक के जागरूकता / प्रतीक्षा की खराब प्रभाव

अंत में, लूसियन विशीक से इस विषय पर एक छोटा सा छोटा वीडियो है: Async लाइब्रेरी विधियों को कार्य का उपयोग करने पर विचार करना चाहिए । कॉन्फ़िग्वायरआवाइट (गलत)

उम्मीद है की यह मदद करेगा।

कॉन्फ़िगरएवाइट (झूठे) का उपयोग करने के साथ मैंने सबसे बड़ा ड्रॉ बैक किया है, यह है कि धागा संस्कृति को सिस्टम डिफ़ॉल्ट में वापस कर दिया गया है यदि आपने किसी संस्कृति को कॉन्फ़िगर किया है …

 <system.web> <globalization culture="en-AU" uiCulture="en-AU" /> ... 

और आप उस सर्वर पर होस्ट कर रहे हैं जिनकी संस्कृति को अमेरिका में सेट किया गया है, तो आपको कॉन्फ़िगरएवाइट (झूठे) को संस्कृतिइंफो कहा जाने से पहले मिलेगा। कंटेंटकल्चर एन-एयू लौटाएगा और आपके एन-यूएस के बाद आएगा अर्थात

 // CultureInfo.CurrentCulture ~ {en-AU} await xxxx.ConfigureAwait(false); // CultureInfo.CurrentCulture ~ {en-US} 

यदि आपका एप्लिकेशन कुछ भी कर रहा है जो डेटा के विशिष्ट प्रकार के स्वरूपण की आवश्यकता है, तो कॉन्फ़िगर एवाइट (गलत) का उपयोग करते समय आपको इसके बारे में ध्यान रखना होगा।

Task के कार्यान्वयन के बारे में मेरे पास कुछ सामान्य विचार हैं:

  1. कार्य डिस्पोजेबल है, लेकिन हम इसका using करने के लिए using नहीं करना चाहते हैं।
  2. ConfigureAwait 4.5 में शुरू की गई थी। Task 4.0 में शुरू किया गया था।
  3. .NET थ्रेड हमेशा संदर्भ प्रवाह (सी # सीएलआर बुक के माध्यम से देखें) के लिए इस्तेमाल किया जाता है, लेकिन Task.ContinueWith के मूल कार्यान्वयन में। Task.ContinueWith वे बी / सी नहीं करते थे, इसलिए यह समझ गया था कि संदर्भ स्विच महंगा है और इसे डिफ़ॉल्ट रूप से बंद कर दिया गया है।
  4. समस्या यह है कि पुस्तकालय डेवलपर को इसकी परवाह नहीं होनी चाहिए कि उसके ग्राहकों को संदर्भ प्रवाह की जरूरत है या नहीं, इसलिए इसे तय नहीं करना चाहिए कि संदर्भ प्रवाह या नहीं।
  5. [बाद में जोड़ा गया] तथ्य यह है कि कोई आधिकारिक जवाब और उचित संदर्भ नहीं है और हम इस पर संघर्ष करते हैं कि किसी ने अपनी नौकरी सही नहीं की है।

मुझे इस विषय पर कुछ पद मिल चुके हैं, लेकिन मेरा लेना – टुबेर्क के अच्छे उत्तर के अलावा – यह है कि आपको सभी एपीआई को अतुल्यकालिक और आदर्श रूप से प्रक्षेपित करना चाहिए। चूंकि आप async कर रहे हैं, इसलिए आप प्रतीक्षा की बजाय निरंतरता का उपयोग कर सकते हैं, इसलिए कोई गतिरोध नहीं होगा क्योंकि पुस्तकालय में कोई इंतजार नहीं किया गया है और आप प्रवाहित (जैसे एचटीटीपी कॉन्टेस्टेक्ट) संरक्षित हैं।

समस्या तब होती है जब एक पुस्तकालय एक तुल्यकालिक एपीआई को उजागर करता है लेकिन एक अन्य अतुल्यकालिक एपीआई का उपयोग करता है – इसलिए आपको अपने कोड में Wait() / Result का उपयोग करने की आवश्यकता है।