आपको विषय पर मेरा MSDN लेख मददगार लग सकता है ; मैंने उस लेख में बहुत सी जगह ली, जिसमें यह वर्णन किया गया था कि आपकोasync
ASP.NET पर उपयोग करना चाहिए , न किasync
ASP.NET पर कैसे उपयोग किया जाए।
मुझे ASP.NET MVC में async क्रियाओं का उपयोग करने में कुछ चिंताएँ हैं। जब यह मेरे ऐप्स के प्रदर्शन में सुधार करता है, और जब - नहीं।
सबसे पहले, यह समझ async
/ await
सब के बारे में है धागे को मुक्त । जीयूआई अनुप्रयोगों पर, यह मुख्य रूप से जीयूआई थ्रेड को मुक्त करने के बारे में है ताकि उपयोगकर्ता अनुभव बेहतर हो। सर्वर अनुप्रयोगों पर (ASP.NET MVC सहित), यह मुख्य रूप से अनुरोध थ्रेड को मुक्त करने के बारे में है ताकि सर्वर स्केल कर सके।
विशेष रूप से, यह नहीं होगा:
- अपने व्यक्तिगत अनुरोधों को तेज़ी से पूरा करें। वास्तव में, वे (बस एक किशोर सा) धीमी गति से पूरा करेंगे।
- जब आप एक हिट करते हैं तो कॉल करने वाले / ब्राउज़र पर लौटें
await
। await
ASP.NET थ्रेड पूल में केवल "पैदावार", ब्राउज़र के लिए नहीं।
पहला सवाल है - क्या एएसपीनेट एमवीसी में हर जगह एसिंक्स एक्शन का इस्तेमाल करना अच्छा है?
मैं कहूंगा कि आप इसका उपयोग हर उस जगह करना चाहते हैं जहाँ आप I / O कर रहे हैं। यह आवश्यक रूप से फायदेमंद नहीं हो सकता है , हालांकि (नीचे देखें)।
हालांकि, सीपीयू-बाउंड तरीकों के लिए इसका उपयोग करना बुरा है। कभी-कभी देवों को लगता है कि वे अपने नियंत्रकों में async
कॉल करके लाभ प्राप्त कर सकते हैं Task.Run
, और यह एक भयानक विचार है। क्योंकि वह कोड किसी अन्य धागे को लेने से अनुरोध थ्रेड को समाप्त कर देता है, इसलिए इसका कोई लाभ नहीं है (और वास्तव में, वे अतिरिक्त थ्रेड स्विच का दंड ले रहे हैं)!
जब मैं डेटाबेस (EF / NHibernate / अन्य ORM के माध्यम से) को क्वेरी करना चाहता हूँ, तो मैं async / प्रतीक्षारत खोजशब्दों का उपयोग करता हूँ?
आपके पास जो भी उपलब्ध विधियाँ हैं, उनका उपयोग आप कर सकते हैं। अभी अधिकांश प्रमुख खिलाड़ी समर्थन करते हैं async
, लेकिन कुछ ऐसे हैं जो नहीं करते हैं। यदि आपका ORM समर्थन नहीं करता है async
, तो इसे Task.Run
या उस तरह की किसी चीज़ में लपेटने का प्रयास न करें (ऊपर देखें)।
ध्यान दें कि मैंने कहा "आप उपयोग कर सकते हैं"। यदि आप ASP.NET MVC के बारे में एकल डेटाबेस बैकएंड के साथ बात कर रहे हैं, तो आप (लगभग निश्चित रूप से) कोई स्केलेबिलिटी लाभ प्राप्त नहीं करने जा रहे हैं async
। ऐसा इसलिए है क्योंकि IIS SQL सर्वर (या अन्य क्लासिक RDBMS) के एकल उदाहरण की तुलना में कहीं अधिक समवर्ती अनुरोधों को संभाल सकता है। हालाँकि, यदि आपका बैकएंड अधिक आधुनिक है - एक SQL सर्वर क्लस्टर, Azure SQL, NoSQL, आदि - और आपका बैकेंड स्केल कर सकता है, और आपकी स्केलेबिलिटी अड़चन IIS है, तो आप एक स्केलेबिलिटी लाभ प्राप्त कर सकते हैं async
।
तीसरा प्रश्न - मैं एक एकल क्रिया विधि में अतुल्यकालिक रूप से डेटाबेस क्वेरी करने के लिए कितनी बार प्रतीक्षा कर सकते हैं?
जितने चाहे उतने। हालांकि, ध्यान दें कि कई ओआरएम में एक-ऑपरेशन-प्रति-कनेक्शन नियम है। विशेष रूप से, EF केवल DbContext प्रति एकल ऑपरेशन की अनुमति देता है; यह सही है कि ऑपरेशन सिंक्रोनस है या एसिंक्रोनस।
इसके अलावा, अपने बैकएंड की मापनीयता को फिर से ध्यान में रखें। यदि आप SQL सर्वर का एक भी उदाहरण मार रहे हैं, और आपका IIS पहले से ही SQLServer को पूरी क्षमता पर रखने में सक्षम है, तो SQLServer पर दबाव को दोगुना या तिगुना करना आपकी मदद करने वाला नहीं है।