MVC5 के साथ एसिंक्स का उपयोग करने का क्या फायदा है?


120

दोनों के बीच क्या अंतर है:

public ActionResult Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        IdentityResult result = IdentityManager.Authentication.CheckPasswordAndSignIn(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
        if (result.Success)
        {
            return Redirect("~/home");
        }
        else
        {
            AddErrors(result);
        }
    }
    return View(model);
}

तथा:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        IdentityResult result = await IdentityManager.Authentication.CheckPasswordAndSignInAsync(AuthenticationManager, model.UserName, model.Password, model.RememberMe);
        if (result.Success)
        {
            return Redirect("~/home");
        }
        else
        {
            AddErrors(result);
        }
    }
    return View(model);
}

मैं देखता हूं कि MVC कोड में अब async है लेकिन क्या अंतर है। क्या एक दूसरे की तुलना में बेहतर प्रदर्शन देता है? क्या एक से दूसरे के साथ समस्याओं को डीबग करना आसान है? क्या मुझे Async को जोड़ने के लिए अपने आवेदन के लिए अन्य नियंत्रकों में परिवर्तन करना चाहिए?


अधिकांश स्थितियों में MVC में
एसिंक्रोनस

1
@ क्रिसमरिकिस - सबसे गंभीर में से एक: आप रीडरविटरलॉक या किसी अन्य सिंक्रोनाइज़ेशन प्राइमेटिव (सेमाफोर को छोड़कर) का उपयोग नहीं कर सकते।
क्वार्कली

जवाबों:


170

Async क्रियाएँ केवल तब उपयोगी होती हैं जब आप I / O बाध्य ऑपरेशन जैसे दूरस्थ सर्वर कॉल कर रहे हों। Async कॉल का लाभ यह है कि I / O ऑपरेशन के दौरान, कोई ASP.NET वर्कर थ्रेड का उपयोग नहीं किया जा रहा है। तो यहाँ कैसे पहला उदाहरण काम करता है:

  1. जब कोई अनुरोध कार्रवाई हिट करता है, ASP.NET थ्रेड पूल से एक धागा लेता है और इसे निष्पादित करना शुरू कर देता है।
  2. IdentityManager.Authentication.CheckPasswordAndSignInविधि शुरू हो जाती है। यह एक अवरोधक कॉल है -> पूरे कॉल के दौरान श्रमिक धागे को खतरे में डाला जा रहा है।

और यहां बताया गया है कि दूसरी कॉल कैसे काम करती है:

  1. जब कोई अनुरोध कार्रवाई हिट करता है, ASP.NET थ्रेड पूल से एक धागा लेता है और इसे निष्पादित करना शुरू कर देता है।
  2. IdentityManager.Authentication.CheckPasswordAndSignInAsyncकहा जाता है जो तुरंत वापस आती है। I / O पूर्णता पोर्ट पंजीकृत है और ASP.NET वर्कर थ्रेड थ्रेड पूल के लिए जारी किया गया है।
  3. बाद में जब ऑपरेशन पूरा हो जाता है, तो आई / ओ कम्प्लीशन पोर्ट को संकेत दिया जाता है, दृश्य को वापस करने के लिए थ्रेड पूल से एक और धागा निकाला जाता है।

जैसा कि आप दूसरे मामले में देख सकते हैं ASP.NET वर्कर थ्रेड केवल थोड़े समय के लिए उपयोग किए जाते हैं। इसका मतलब है कि अन्य अनुरोधों की सेवा के लिए पूल में अधिक धागे उपलब्ध हैं।

इसलिए निष्कर्ष निकालने के लिए, केवल जब आप एक सच्चे async एपीआई अंदर async कार्रवाई का उपयोग करें। यदि आप एक async कार्रवाई के अंदर एक अवरुद्ध कॉल करते हैं, तो आप इसका पूरा लाभ उठा रहे हैं।


संदर्भ सिंक्रनाइज़ेशन के बारे में कैसे। क्या यह ऐसा ओवरहेड नहीं होगा कि आप एसिंक्स क्रियाओं का उपयोग बिल्कुल नहीं करना चाहते हैं? "एक एसिंक्स पद्धति का ओवरहेड, जो वास्तव में एसिंक्रोनस रूप से निष्पादित करता है, यह पूरी तरह से इस बात पर निर्भर करता है कि उसे सिंक्रोनाइज़ेशन कॉन्टेक्स्ट.पोस्ट का उपयोग करके थ्रेड्स को स्विच करने की आवश्यकता है। यदि ऐसा होता है, तो ओवरहेड को थ्रेड स्विच द्वारा हावी किया जाता है जो इसे फिर से शुरू करता है। इसका मतलब है कि वर्तमान सिंक्रोनाइज़ेशन कॉनटेक्स्ट बनाता है। एक बड़ा फर्क।" (Async में C # 5.0, 2012, एलेक्स डेविस)
annemartijn

1
@Darin मुख्य धागा जारी करना इतना महत्वपूर्ण क्यों है? क्या धागा सीमित हैं?
ओमटेकगुई

1
@Omtechguy एक CDN पर गैर ASP.NET अनुरोधों को स्थानांतरित करने के लिए एक बेहतर समाधान है। एक साधारण CDN केवल आपकी जावास्क्रिप्ट और चित्रों जैसी भौतिक फ़ाइलों के लिए उपडोमेन और अलग ऐप पूल का उपयोग कर रहा है। वैकल्पिक रूप से आप फ़ाइलों के लिए NgineX / Lighttpd / Apache का उपयोग कर सकते हैं, या आप अकमाई (CDN के लिए राजा लेकिन सबसे महंगी) जैसी तीसरी पार्टी सेवा का उपयोग कर सकते हैं
क्रिस मैरिसिक

मैं अभी भी असमंजस में हूँ। जब CheckPasswordAndSignInAsyncबुलाया जाता है, ASP.NET थ्रेड पूल से एक और धागा लेता है और इसे निष्पादित करना शुरू कर देता है, है ना? यदि यह नहीं है, तो कहाँ checking password procedureनिष्पादित किया जाता है?
केविनबुई

2

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

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


0

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


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