मैं 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);
}
जैसा कि मैं चीजों को समझता हूं, यह है कि चीजें रनटाइम पर कैसे सामने आएंगी:
आने वाले HTTP अनुरोध के लिए ASP.NET थ्रेड बनाया जाएगा।
यह धागा (संभवतया कुछ आवश्यक प्रारंभिक कार्य करने के बाद) ऊपर मेरे सूचकांक () विधि में प्रवेश करेगा।
निष्पादन "प्रतीक्षा" कीवर्ड तक पहुंच जाएगा और डेटा थ्रेड प्रक्रिया को किसी अन्य थ्रेड पर किक करेगा।
मूल "ASP.NET" धागा कोड पर वापस आ जाएगा जो कि मेरे हैंडलर विधि को कहा जाता है, रिटर्न वैल्यू के रूप में क्लास टास्क के एक उदाहरण के साथ।
इंफ्रास्ट्रक्चरल कोड जिसे मेरे हैंडलर विधि कहा जाता है, मूल "ASP.NET" थ्रेड पर काम करना जारी रखेगा, जब तक कि यह उस बिंदु तक नहीं पहुंच जाता जहां इसे वास्तविक ActionResult ऑब्जेक्ट (जैसे पेज को रेंडर करने के लिए) का उपयोग करने की आवश्यकता होती है।
कॉल करने वाला तब टास्क का उपयोग करके इस ऑब्जेक्ट को एक्सेस करेगा। रिस्कल्ट सदस्य, जिसके कारण यह (यानी "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
एक और धागे की आवश्यकता नहीं है ... यह एक निरंतरता है। यह एक ही धागे पर