इस सवाल के बाद, यह ASP.NET MVC में async संचालन का उपयोग करते समय मुझे आरामदायक बनाता है। तो, मैंने उस पर दो ब्लॉग पोस्ट लिखे:
ASP.NET MVC पर अतुल्यकालिक संचालन के बारे में मेरे मन में बहुत सी गलतफहमियाँ हैं।
मैं हमेशा इस वाक्य को सुनता हूं: यदि ऑपरेशन अतुल्यकालिक रूप से चलता है तो आवेदन बेहतर पैमाने पर हो सकता है
और मैंने इस तरह के वाक्यों को बहुत सुना है: यदि आपके पास ट्रैफ़िक की एक बड़ी मात्रा है, तो आप अपने प्रश्नों को अतुल्यकालिक रूप से नहीं करने से बेहतर हो सकते हैं - एक अनुरोध सेवा के लिए 2 अतिरिक्त थ्रेड का सेवन संसाधनों को अन्य आने वाले अनुरोधों से दूर ले जाता है।
मुझे लगता है कि वे दो वाक्य असंगत हैं।
मुझे इस बारे में अधिक जानकारी नहीं है कि ASP.NET पर थ्रेडपूल कैसे काम करता है, लेकिन मुझे पता है कि थ्रेडपूल थ्रेड्स के लिए एक सीमित आकार है। तो, दूसरा वाक्य इस मुद्दे से संबंधित होना चाहिए।
और मैं जानना चाहूंगा कि क्या ASP.NET MVC में अतुल्यकालिक संचालन .NET 4 पर थ्रेडपूल से एक थ्रेड का उपयोग करता है?
उदाहरण के लिए, जब हम एक AsyncController को लागू करते हैं, तो ऐप कैसे संरचना करता है? यदि मुझे बहुत अधिक ट्रैफ़िक मिलता है, तो क्या AsyncController को लागू करना एक अच्छा विचार है?
क्या कोई ऐसा व्यक्ति है जो मेरी आँखों के सामने इस काले पर्दे को हटा सकता है और मुझे ASP.NET MVC 3 (NET 4) पर अतुल्यकालिक के बारे में समझा सकता है?
संपादित करें:
मैंने इस दस्तावेज़ को लगभग सैकड़ों बार पढ़ा है और मैं मुख्य सौदे को समझता हूं लेकिन फिर भी मुझे भ्रम है क्योंकि वहाँ बहुत अधिक असंगत टिप्पणी है।
ASP.NET MVC में एक अतुल्यकालिक नियंत्रक का उपयोग करना
संपादित करें:
मान लें कि मेरे पास नीचे की तरह नियंत्रक कार्रवाई है ( AsyncController
हालांकि कार्यान्वयन नहीं ):
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
जैसा कि आप यहां देख रहे हैं, मैं एक ऑपरेशन में आग लगाता हूं और इसके बारे में भूल जाता हूं। फिर, मैं इसे पूरा किए बिना इंतजार किए तुरंत लौट जाता हूं।
इस मामले में, क्या इसे थ्रेडपूल से एक धागे का उपयोग करना है? यदि हां, तो इसके पूरा होने के बाद, उस धागे का क्या होता है? क्या GC
यह पूरा होने के बाद ही अंदर आता है और सफाई करता है?
संपादित करें:
@ डारिन के जवाब के लिए, यहां async कोड का एक नमूना है जो डेटाबेस से बात करता है:
public class FooController : AsyncController {
//EF 4.2 DbContext instance
MyContext _context = new MyContext();
public void IndexAsync() {
AsyncManager.OutstandingOperations.Increment(3);
Task<IEnumerable<Foo>>.Factory.StartNew(() => {
return
_context.Foos;
}).ContinueWith(t => {
AsyncManager.Parameters["foos"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
Task<IEnumerable<Bars>>.Factory.StartNew(() => {
return
_context.Bars;
}).ContinueWith(t => {
AsyncManager.Parameters["bars"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
Task<IEnumerable<FooBar>>.Factory.StartNew(() => {
return
_context.FooBars;
}).ContinueWith(t => {
AsyncManager.Parameters["foobars"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
}
public ViewResult IndexCompleted(
IEnumerable<Foo> foos,
IEnumerable<Bar> bars,
IEnumerable<FooBar> foobars) {
//Do the regular stuff and return
}
}