दिलचस्प पोस्ट
बहिष्कृत jQuery टॉगल इवेंट के समतुल्य क्या Node.js देशी Promise.all प्रसंस्करण में समानांतर या क्रमिक रूप से? आईओएस 3 जी या वाईफ़ाई का पता लगाएं "प्रतीक्षा_फ़ेंस: उत्तर प्राप्त करने में विफल: 10004003"? सी इंट और लांग 32 – 64 बिट्स में मान की रेंज यूनिटी में साधारण इवेंट सिस्टम वैक्टर के एक वेक्टर द्वारा दर्शाए गए मैट्रिक्स का पहला कॉलम प्राप्त करें पर्ल में मेरे ($ variableName) और मेरे $ variableName में अंतर क्या है? 30 के संशोधन के बाद "<sdk> / extras / google / google_play_services / libproject" फ़ोल्डर अनुपलब्ध है Android में गतिविधियों के बीच डेटा पास करना मैं एक स्ट्रिंग के लिए .net (c #) में एक हैशकोड कैसे बनाऊँगा जो डेटाबेस में संग्रहीत करने के लिए सुरक्षित है? दो चयन कथन के परिणाम शामिल हों I जावा में स्ट्रिंग डिफ्स कैसे करें? पार्सल चला सकते हैं समानांतर में आदेश? पीएचपी + जेएस: कैसे सामग्री-प्रकार मल्टीपार्ट (जे एस के माध्यम से) के रूप में HTML फॉर्म में Fileuploads?

मैं एएसपी.नेट एमवीसी में एसिंक कंट्रोलर्स का उपयोग कब करना चाहिए?

मुझे एएसपी.नेट एमवीसी में async कार्यों के उपयोग के बारे में कुछ चिंताओं हैं I यह मेरे ऐप के प्रदर्शन को बेहतर बनाता है, और यह कब नहीं करता?

  1. क्या एएसपी.नेट एमवीसी में हर जगह एएसआईएनसी एक्शन का प्रयोग करना अच्छा है?
  2. अभूतपूर्व तरीकों के बारे में: जब मैं एक डेटाबेस (ईएफ / एनआईबीनेट / अन्य ओआरएम के माध्यम से) पूछना चाहता हूं, तो मैं async / खोजशब्दों का उपयोग करूँगा?
  3. मैं कितनी बार खोजशब्दों का इंतजार कर सकता हूं, जो कि एक ही ऐक्शन मेथड में अतुल्यकालिक डेटाबेस को क्वेरी कर सकता है?

वेब के समाधान से एकत्रित समाधान "मैं एएसपी.नेट एमवीसी में एसिंक कंट्रोलर्स का उपयोग कब करना चाहिए?"

एसिंक्रोनस क्रिया विधियां उपयोगी होती हैं, जब एक एक्शन को कई स्वतंत्र लंबे चलने वाले कार्य करना चाहिए।

AsyncController वर्ग के लिए एक सामान्य उपयोग लंबी-चलती वेब सेवा कॉल है।

क्या मेरा डेटाबेस कॉल अतुल्यकालिक हो सकता है?

आईआईएस थ्रेड पूल अक्सर एक डेटाबेस सर्वर से अधिक एक साथ अवरोधन अनुरोधों को संभाल सकता है। यदि डेटाबेस बाधा है, तो अतुल्यकालिक कॉल डेटाबेस प्रतिक्रिया को गति नहीं देगा। एक थ्रॉटलिंग तंत्र के बिना, एसिंक्रोनस कॉल्स का उपयोग करके एक डूबे हुए डेटाबेस सर्वर को अधिक कुशलता से प्रेषण करना, बस डेटाबेस को अधिक बोझ में बदलाव करता है। यदि आपका डीबी बाधा है, तो असिंक्रोनस कॉल्स जादू बुलेट नहीं होगा।

आपको 1 और 2 संदर्भों पर नजर रखना चाहिए

Panagiotis @ kanavos टिप्पणी से प्राप्त:

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

आपको यह भी विचार करना चाहिए कि ब्लॉकिंग कॉल एक सीपीयू-गहन स्पिनवाइट के साथ शुरू होती हैं। तनाव समय के दौरान, अवरुद्ध कॉल के परिणामस्वरूप बढ़ते विलंब और ऐप पूल रीसाइक्लिंग होगा। असिंक्रोनस कॉल बस इस से बचें

आप इस विषय पर मेरी MSDN लेख पा सकते हैं; मैं एएसपी.नेट पर async का प्रयोग करने के दौरान एएसपी.नेट पर async का इस्तेमाल कैसे करना चाहिए, इसका वर्णन करते हुए उस आलेख में बहुत सी जगह ले ली।

मुझे एएसपी.नेट एमवीसी में async कार्यों के उपयोग के बारे में कुछ चिंताओं हैं I जब यह मेरे ऐप्स के प्रदर्शन को बेहतर बनाता है, और कब – नहीं

सबसे पहले, समझें कि async / async सभी धागे को मुक्त करने के बारे में है जीयूआई अनुप्रयोगों पर, यह मुख्य रूप से जीयूआई थ्रेड को मुक्त करने के लिए है ताकि उपयोगकर्ता का अनुभव बेहतर हो। सर्वर अनुप्रयोगों (एएसपी.नेट एमवीसी सहित) पर, यह मुख्य रूप से अनुरोध धागा को मुक्त करने के लिए है ताकि सर्वर पैमाने पर हो सके।

विशेष रूप से, यह नहीं होगा:

  • अपने व्यक्तिगत अनुरोधों को तेज़ी से पूरा करें वास्तव में, वे धीमे हो जाएगा (केवल एक छोटी सी)
  • कॉलर / ब्राउज़र पर लौटें जब आप await एएसपी.NET थ्रेड पूल में केवल "उपज" का await , न कि ब्राउज़र को।

पहला सवाल है – क्या एएसपी.नेट एमवीसी में हर जगह एएससिंक एक्शन का प्रयोग करना अच्छा है?

मैं कह सकता हूं कि मैं इसे हर जगह उपयोग कर रहा हूं I / O यह जरूरी नहीं कि उपयोगी हो , हालांकि (नीचे देखें)।

हालांकि, सीपीयू-बद्ध विधियों के लिए इसका उपयोग करना बुरा है। कभी-कभी devs लगता है कि वे कार्य को बुलाकर Task.Run के लाभ प्राप्त कर सकते हैं। अपने नियंत्रकों में Task.Run , और यह एक भयानक विचार है क्योंकि यह कोड दूसरे धागे को लेकर अनुरोध धागा को मुक्त करने के लिए समाप्त होता है, इसलिए सभी पर कोई लाभ नहीं होता (और वास्तव में, वे अतिरिक्त थ्रेड स्विच का जुर्माना ले रहे हैं)!

क्या मैं async का उपयोग / जब मैं डेटाबेस (ईएफ / NHibernate / अन्य ORM के माध्यम से) क्वेरी करना चाहते हैं, तब खोजना होगा?

आप जो कुछ भी उपलब्ध तरीकों का इस्तेमाल कर सकते हैं फिलहाल ज्यादातर प्रमुख खिलाड़ी async समर्थन करते हैं, लेकिन कुछ ऐसा नहीं है जो नहीं करते हैं। यदि आपका ORM async समर्थन नहीं करता है, तो इसे कार्य में लपेटने का प्रयास न करें। Task.Run या उस जैसी कुछ (ऊपर देखें)

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

तीसरा सवाल – कितनी बार मैं एक एकल कार्य पद्धति में एसिंक्रोनस डेटाबेस को क्वेरी करने के लिए खोजशब्दों का इंतजार कर सकता हूं?

जितना आप चाहें उतना ही। हालांकि, ध्यान रखें कि कई ORM के पास एक ऑपरेशन-प्रति-कनेक्शन नियम है। विशेष रूप से, ईएफ केवल प्रत्येक ऑपरेशन प्रति DbContext अनुमति देता है; यह सच है कि ऑपरेशन तुल्यकालिक या असिंक्रोनस है।

साथ ही, अपने बैकेंड की स्केलिबिलिटी को फिर से याद रखें। यदि आप SQL सर्वर का एक उदाहरण मार रहे हैं, और आपकी IIS पहले से ही SQLServer को पूर्ण क्षमता में रखने में सक्षम है, तब SQLServer पर दोगुना या दोगुनी यानी तीन गुना आपकी मदद नहीं कर रहा है।

एएसपी.नेट एमवीसी में हर जगह एएसआईएनसी एक्शन का प्रयोग करना अच्छा है?

प्रोग्रामिंग में हमेशा की तरह, यह निर्भर करता है । एक निश्चित मार्ग नीचे जाने पर हमेशा एक व्यापार बंद होता है

async-await उन स्थानों पर चमकता है जहां आप जानते हैं कि आप अपनी सेवा के लिए समवर्ती अनुरोध प्राप्त करेंगे और आप अच्छी तरह से स्केल आउट करने में सक्षम होना चाहते हैं। कैसे async-await करने में सहायता async-await है? तथ्य यह है कि जब आप एक async IO कॉल को सिंक्रोनस से कॉल करते हैं, जैसे कि एक नेटवर्क कॉल या आपके डेटाबेस को मारने के लिए, निष्पादन के लिए जिम्मेदार वर्तमान थ्रेड को समाप्त करने के अनुरोध के लिए अवरुद्ध कर दिया गया है। जब आप async-await उपयोग करते हैं, तो आप अपने लिए एक राज्य मशीन बनाने के लिए ढांचे को सक्षम करते हैं जो यह सुनिश्चित करता है कि IO कॉल पूर्ण होने के बाद, आपकी विधि उस स्थान से जारी रहती है जहां से इसे छोड़ दिया गया था।

ध्यान देने योग्य बात यह है कि यह राज्य मशीन एक सूक्ष्म ओवरहेड है। एक विधि अतुल्यकालिक बनाने से इसे तेजी से निष्पादित नहीं किया जाता है , और यह समझने के लिए एक महत्वपूर्ण कारक है और गलत धारणा कई लोगों के पास है

async-await का उपयोग करते समय विचाराधीन होने के लिए एक और चीज यह तथ्य है कि यह सभी तरह से एसिंक है , जिसका अर्थ है कि आप एसिंक को अपने पूरे कॉल स्टैक में घुसना करेंगे, ऊपर से बटम तक। इसका मतलब यह है कि यदि आप तुल्यकालिक एपीआई को उजागर करना चाहते हैं, तो आप अक्सर अपने आप को कुछ निश्चित कोड की नकल करेंगे, क्योंकि async और सिंक बहुत अच्छी तरह से मिश्रण नहीं करते।

क्या मैं async का उपयोग / जब मैं डेटाबेस (ईएफ / NHibernate / अन्य ORM के माध्यम से) क्वेरी करना चाहते हैं, तब खोजना होगा?

यदि आप async IO कॉल का उपयोग करने का रास्ता नीचे लेना चुनते हैं, तो हां, async-await एक अच्छा विकल्प होगा, क्योंकि अधिक से अधिक आधुनिक डेटाबेस प्रदाता एएपीएनसी पद्धति को लागू करने के लिए टीएपी (टास्क एसिंक्रोनस पैटर्न) को लागू करते हैं।

कितनी बार मैं एक ही कार्रवाई विधि में एसिंक्रोनस डेटाबेस क्वेरी करने के लिए खोजशब्दों का इंतजार कर सकता हूँ?

जितनी चाहें, उतनी जब तक आप अपने डेटाबेस प्रदाता द्वारा बताए गए नियमों का पालन करें। आप कर सकते हैं async कॉल की मात्रा के लिए कोई सीमा नहीं है। यदि आपके पास प्रश्न हैं जो एक दूसरे से स्वतंत्र हैं और एक साथ किया जा सकता है, तो आप प्रत्येक के लिए एक नया कार्य स्पिन कर सकते हैं और await Task.WhenAll का इंतजार कर सकते हैं। जब सभी को पूरा करने के लिए इंतजार करना होगा

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

मेरा 5 सेंट:

  1. async/await उपयोग करें async/await करें और अगर आप केवल IO ऑपरेशन करते हैं, जैसे डीबी या बाहरी सेवा webservice
  2. हमेशा डीबी के लिए async कॉल पसंद करते हैं।
  3. हर बार जब आप डीबी पूछेंगे।

पीएस 1 बिंदु के लिए असाधारण मामलों हैं, लेकिन आपको इस के लिए एसिंक इंटरनल की अच्छी समझ होना चाहिए।

एक अतिरिक्त लाभ के रूप में, यदि आवश्यक हो तो आप समानांतर में कुछ आईओ कॉल कर सकते हैं:

 Task task1 = FooAsync(); // launch it, but don't wait for result Task task2 = BarAsync(); // launch bar; now both foo and bar are running await Task.WhenAll(task1, task2); // this is better in regard to exception handling // use task1.Result, task2.Result 

जैसा कि आप जानते हैं, एमवीसी अतुल्यकालिक नियंत्रकों का समर्थन करता है और आप इसका लाभ लेना चाहिए। यदि आपका नियंत्रक एक लंबा कार्य करता है, (यह एक डिस्क आधारित आई / ओ या एक अन्य दूरदराज से सेवा के लिए एक नेटवर्क कॉल हो सकता है), यदि अनुरोध को तुल्यकालिक तरीके से संभाला जाता है, तो आईआईएस थ्रेड पूरे समय व्यस्त है। नतीजतन, धागा बस पूरा करने के लिए लंबा ऑपरेशन के लिए इंतजार कर रहा है। यह पहले से अनुरोधित ऑपरेशन की प्रगति पर है, जबकि अन्य अनुरोधों को पूरा करके इसका बेहतर उपयोग किया जा सकता है। इससे अधिक समवर्ती अनुरोधों की सेवा करने में मदद मिलेगी। आपकी webservice अत्यधिक स्केल योग्य होगी और आसानी से C10k समस्या में नहीं चलेगा डीब क्वेरीज़ के लिए async / await का उपयोग करना एक अच्छा विचार है और हां, आप उनको कई बार उपयोग कर सकते हैं जैसे कि आप फिट समझते हैं।

उत्कृष्ट सलाह के लिए यहाँ एक नज़र डालें।