ASP.NET MVC में Async नियंत्रकों: वास्तविक लाभ / कैसे प्राप्त किया?


12

मैं ASP.NET MVC ( http://visualstudiomagazine.com/articles/2013/07/23/async-actions-in-aspnet-mvc-4.aspx ) में अतुल्यकालिक नियंत्रक विधियों के बारे में एक लेख के माध्यम से काम कर रहा हूं और मुझे लगता है मुझे बात याद आ रही है।

इस विधि पर मैंने विचार किया, जो लेख से एक उदाहरण के समान है:

[HttpGet]
[AsyncTimeout(8000)]
[HandleError(ExceptionType = typeof(TimeoutException), View = "TimedOut")]
public async Task<ActionResult> Index(CancellationToken cancellationToken)
{
    WidgetPageViewModel model = new WidgetPageViewModel()
    {
        toAdd = new Widget()
    };
    model.all = await _repo.GetAllAsync(cancellationToken);
    return View(model);
}

जैसा कि मैं चीजों को समझता हूं, यह है कि चीजें रनटाइम पर कैसे सामने आएंगी:

  1. आने वाले HTTP अनुरोध के लिए ASP.NET थ्रेड बनाया जाएगा।

  2. यह धागा (संभवतया कुछ आवश्यक प्रारंभिक कार्य करने के बाद) ऊपर मेरे सूचकांक () विधि में प्रवेश करेगा।

  3. निष्पादन "प्रतीक्षा" कीवर्ड तक पहुंच जाएगा और डेटा थ्रेड प्रक्रिया को किसी अन्य थ्रेड पर किक करेगा।

  4. मूल "ASP.NET" धागा कोड पर वापस आ जाएगा जो कि मेरे हैंडलर विधि को कहा जाता है, रिटर्न वैल्यू के रूप में क्लास टास्क के एक उदाहरण के साथ।

  5. इंफ्रास्ट्रक्चरल कोड जिसे मेरे हैंडलर विधि कहा जाता है, मूल "ASP.NET" थ्रेड पर काम करना जारी रखेगा, जब तक कि यह उस बिंदु तक नहीं पहुंच जाता जहां इसे वास्तविक ActionResult ऑब्जेक्ट (जैसे पेज को रेंडर करने के लिए) का उपयोग करने की आवश्यकता होती है।

  6. कॉल करने वाला तब टास्क का उपयोग करके इस ऑब्जेक्ट को एक्सेस करेगा। रिस्कल्ट सदस्य, जिसके कारण यह (यानी "ASP.NET" थ्रेड) उपरोक्त चरण # 3 में निहित धागे की प्रतीक्षा करने के लिए होगा।

मैं यह नहीं देख रहा हूं कि यह प्रतीक्षा किए बिना / async के बिना एक ही चीज़ की तुलना में यह क्या पूरा करता है, दो चीजों को छोड़कर जो मैं trifling के रूप में समझता हूं:

  • कॉलर थ्रेड और वेट द्वारा बनाया गया वर्कर थ्रेड कुछ समय के लिए ("ऊपर" # 5 के भाग तक) के समानांतर चल सकता है। मेरा कूबड़ है कि समय की अवधि बहुत छोटा है। जब इंफ्रास्ट्रक्चर कंट्रोलर मेथड में कॉल करता है, तो मैं सोच रहा हूं कि आमतौर पर कंट्रोलर कॉल की वास्तविक ActionResult की जरूरत है इससे पहले कि यह बहुत कुछ कर सकता है (यदि कुछ भी अधिक हो)।

  • टाइमआउट और लंबे समय से चल रहे अतुल्यकालिक नियंत्रक कार्यों को रद्द करने से संबंधित कुछ उपयोगी नए बुनियादी ढाँचे हैं।

वास्तव में HTTP अनुरोधों का जवाब देने के लिए उन ASP.NET वर्कर थ्रेड्स को मुक्त करने के लिए async नियंत्रक विधियों को जोड़ने का उद्देश्य माना जाता है। ये सूत्र एक परिमित संसाधन हैं। दुर्भाग्य से, मैं यह नहीं देख रहा हूं कि लेख में सुझाए गए पैटर्न वास्तव में इन थ्रेड्स को संरक्षित करने के लिए कैसे कार्य करते हैं। और यहां तक ​​कि अगर यह करता है, और किसी तरह अनुरोध को संभालने के बोझ को कुछ गैर-PP.NET धागे से हटाता है, तो वह क्या पूरा करता है? क्या थ्रेड्स जो HTTP अनुरोध को संभालने में सक्षम होते हैं, जो सामान्य रूप से थ्रेड्स से बहुत अलग होते हैं?


Execution will reach the "await" keyword and kick off a data acquisition process on another thread-- जरुरी नहीं। asyncएक और धागे की आवश्यकता नहीं है ... यह एक निरंतरता है। यह एक ही धागे पर
रॉबर्ट हार्वे


"निष्पादन प्रतीक्षित कीवर्ड तक पहुंच जाएगा और डेटा थ्रेड प्रक्रिया को किसी अन्य थ्रेड पर किक करेगा।" आपको यह पीछे की ओर मिला: प्रतीक्षा तब होती है जब वह वापस आता है। कोशिश करें और इसे विभाजित करें ताकि आप एक चर में GetAllAsync () से परिणाम बचाएं और इसके बजाय प्रतीक्षा करें और देखें कि क्या यह अधिक स्पष्ट है।
एबेन स्कोव पेडर्सन

जवाबों:


9

ASP.Net जो टास्क पैरेलल लाइब्रेरी (TPL) का उपयोग नहीं करता है, यह एक थ्रेड पूल में थ्रेड्स की संख्या द्वारा समवर्ती रूप से हैंडल कर सकते हैं अनुरोधों की संख्या में सीमित है। ASP.Net जो TPL का उपयोग करता है वह मशीन हैंडलिंग अनुरोधों के CPU / मेमोरी / IO द्वारा सीमित है।

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

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


तो ASP.NET थ्रेड कब पूल में वापस आता है? "प्रतीक्षा" कीवर्ड कब हिट होता है?
user1172763

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

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