मेरे पास एक उच्च-ट्रैफिक सी # एमवीसी 4 वेब एप्लिकेशन है जो उच्च-ट्रैफिक परिदृश्य में है जो विभिन्न भंडारों के लिए निर्भरता इंजेक्शन का उपयोग करता है। यह बहुत उपयोगी है क्योंकि यह आसानी से परीक्षण योग्य है, और उत्पादन में हम विशिष्ट नियंत्रकों के लिए आसानी से भंडार को कॉन्फ़िगर कर सकते हैं। सभी नियंत्रक AsyncController से प्राप्त होते हैं, इसलिए Task<JsonResult>
या Task<ActionResult>
लौटने वाली क्रिया विधियां वास्तव में अधिक उपयोगकर्ताओं और solve for the dreaded thread starvation problem के साथ हमारे सर्वर पैमाने की सहायता करती हैं। कुछ रिपॉजिटरीज वेब सेवाओं का उपयोग करते हैं, जिन्हें हम स्केलेबिलिटी लाभ प्रदान करने के लिए निश्चित रूप से Async/Await का उपयोग कर सकते हैं। अन्य मामलों में, कुछ अप्रबंधित सेवाओं का उपयोग कर सकते हैं जिन्हें सुरक्षित रूप से थ्रेड नहीं किया जा सकता है, जिसमें async/await कोई लाभ नहीं प्रदान करेगा। प्रत्येक भंडार एक इंटरफ़ेस, आईरिपोजिटरी का कार्यान्वयन है। संक्षेप में, प्रत्येक कार्यान्वयन डेटा प्राप्त करने के तरीके में काफी अलग है। यह कॉन्फ़िगरेशन वेब.कॉन्फिग परिवर्तन और ऑटोफ़ैक मॉड्यूल के साथ परिनियोजन-समय पर चुना जाता है।बहु-परत सी # अनुप्रयोगों में Async/Await
इस तरह के किसी एप्लिकेशन में async/प्रतीक्षा करने के लिए सुझाए गए कुछ तरीके क्या हैं? पैटर्न को मेरे मौजूदा एप्लिकेशन में फिट करने के लिए, मुझे Task<MyBusinessObject>
वापस करने के लिए इंटरफ़ेस को बदलना होगा। लेकिन क्या यह कार्यान्वयन विस्तार से अधिक नहीं है? मैं दो विधि स्टब्स, GetData
और GetDataAsync
प्रदान कर सकता हूं, लेकिन मेरे लिए जो अब लचीलापन की अनुमति नहीं देगा IOC फ्रेमवर्क जैसे ऑटोफैक के साथ जहां मैं आसानी से कोड बदलने के बिना सबकुछ बाहर कर सकता हूं।
असिनक/Await के लिए माइक्रोसॉफ्ट डेवलपर्स में से एक ने ब्लॉग पोस्ट प्रकाशित किया है, "Should I expose an asynchronous wrapper for my synchronous methods?" उस तरह की समस्या में चला जाता है। यदि आपकी एसिंक विधि वास्तव में एसिंक नहीं है (मूल I/O लाभ प्रदान करती है) तो यह वास्तव में केवल ओवरहेड जोड़ती है। दूसरे शब्दों में, यह किसी भी स्केलेबिलिटी लाभ प्रदान नहीं करेगा।
मैं बस यह चाहूंगा कि बाकी समुदाय ने इस समस्या का सामना कैसे किया है।
'async' और' await' एक अवरुद्ध विधि को एक गैर-अवरुद्ध विधि में बदलने के लिए केवल अमूर्त हैं। इंटरफ़ेस को बदलने के बिना, आप अपने कोड में कहीं भी ऐसा कर सकते हैं, जब तक आप इंटरफ़ेस विधि को हमेशा असीमित नहीं करना चाहते हैं। –
यदि आपके पास संपूर्ण कॉल स्टैक में कार्य नहीं है, तो इसे कभी भी अतुल्यकालिक रूप से नहीं कहा जाएगा। तो आपको हमेशा एक कार्य वापस करने के लिए इंटरफ़ेस में रखना होगा। –
ऐसा नहीं है जो मैंने कहा था। मैंने जो कहा था, क्या आप किसी भी विधि को 'async' और' await' का उपयोग कर एसिंक्रोनस में बदल सकते हैं, जिसमें आपके इंटरफेस पर पहले से मौजूद उन अवरोधन विधियों में से कोई भी शामिल है। एक विधि ''मूल विधि पर वापसी प्रकार की आवश्यकता नहीं है। यह निश्चित रूप से, आपके सभी इंटरफ़ेस विधियों को उनके 'async' समकक्षों के साथ प्रतिस्थापित करने के लिए एक पूरी तरह से मान्य चीज़ है, लेकिन इसकी आवश्यकता नहीं है। –