मुझे पता है कि यह एक आम सवाल है, लेकिन मैंने लेखों का एक किलो पढ़ा है और उलझन में महसूस किया है। और अब मुझे लगता है कि उन्हें बेहतर नहीं पढ़ना बेहतर होगा))।एएसपी.नेट और एसिंक - यह कैसे काम करता है?
तो, कैसे ASP.NET काम करता है (केवल धागे के बारे में):
- http अनुरोध थ्रेड पूल से धागा सेवा देती हैं।
- अनुरोध करते समय अनुरोध इस थ्रेड में व्यस्त है, क्योंकि अनुरोध वास्तव में इस धागे के अंदर प्रसंस्करण कर रहा है।
- अनुरोध प्रसंस्करण समाप्त होने पर, थ्रेड थ्रेड पूल पर वापस आ जाता है, सर्वर प्रतिक्रिया भेजता है।
क्या यह वर्णित व्यवहार सही है?
जब मैं एएसपी.नेट एमवीसी नियंत्रक के अंदर नया कार्य शुरू करता हूं तो वास्तव में क्या होता है? T1 -
public ActionResult Index()
{
var task1 = Task.Factory.StartNew(() => DoSomeHeavyWork());
return View();
}
private static async Task DoSomeHeavyWork()
{
await Task.Delay(5000);
}
- नियंत्रक कार्रवाई धागा है कि मौजूदा अनुरोध को संसाधित करता है अंदर निष्पादित करने के लिए शुरू होता है।
- थ्रेड पूल कार्य 1 के लिए एक और थ्रेड (टी 2) आवंटित करता है।
- कार्य 1 टी 2 के अंदर "तुरंत" शुरू होता है।
- व्यू परिणाम "तत्काल" लौटाता है।
- एएसपी.नेट कुछ काम करता है, सर्वर प्रतिक्रिया भेजता है, टी 1 थ्रेड पूल पर लौटाता है, टी 2 अभी भी जिंदा है।
- कुछ समय बाद DoSomeHeavyWork समाप्त हो जाएगा, टी 2 थ्रेड थ्रेड पूल में वापस कर दिया जाएगा।
क्या यह सही है?
- कार्रवाई करने के लिए शुरू होता है:
अब देता है async कार्रवाई
public async Task<ActionResult> Index() { await DoSomeHeavyWork(); return View(); }
, मैं पिछले कोड नमूने के साथ अंतर है, लेकिन नहीं की प्रक्रिया को समझने के लिए लग रही है, इस उदाहरण में व्यवहार पीछा कर रहा है थ्रेड के अंदर निष्पादित करें जो वर्तमान अनुरोध को संसाधित करता है - टी 1।
- DoSomeHeavyWork "तत्काल" एक कार्य देता है, चलो इसे "task1" भी कहते हैं।
- टी 1 थ्रेड पूल पर लौटता है। DoSomeHeavyWork समाप्त होने के बाद
- , इंडेक्स कार्रवाई निष्पादित जारी है। इंडेक्स एक्शन निष्पादन के बाद
- सर्वर प्रतिक्रिया देगा।
कृपया व्याख्या 2 अंक और 5 के बीच हो रहा है क्या, प्रश्न हैं:
- DoSomeHeavyWork अंदर संसाधित किया जाता है task1 या जहां (जहां यह "प्रतीक्षित" है)? मुझे लगता है कि यह एक महत्वपूर्ण सवाल है।
- कौन सा थ्रेड प्रतीक्षा के बाद अनुरोध को संसाधित करना जारी रखेगा - थ्रेड पूल से कोई नया, सही?
- अनुरोध थ्रेड पूल से आवंटित थ्रेड का उत्पादन करता है, लेकिन प्रतिक्रिया तब तक नहीं भेजी जाएगी जब तक DoSomeHeavyWorkAsync समाप्त नहीं हो जाता है और इससे कोई फर्क नहीं पड़ता कि यह विधि किस विधि को निष्पादित करती है। दूसरे शब्दों में, एकल अनुरोध और एकल ठोस कार्य (DoSomeHeavyWork) के अनुसार async का उपयोग करने का कोई लाभ नहीं है। क्या यह सही है ?
- यदि पिछले कथन सही है, तो मुझे समझ में नहीं आता कि एसिंक एक ही एकल कार्य के साथ एकाधिक अनुरोधों के प्रदर्शन को बेहतर बना सकता है। मैं समझाने की कोशिश करूंगा। आइए मान लें कि थ्रेड पूल में अनुरोधों को संभालने के लिए 50 धागे उपलब्ध हैं। अनुरोध को थ्रेड पूल से कम से कम एक थ्रेड द्वारा संसाधित किया जाना चाहिए, अगर अनुरोध एक और थ्रेड शुरू करता है, तो उन सभी को थ्रेड पूल से लिया जाएगा, उदा। अनुरोध स्वयं को संसाधित करने के लिए एक धागा लेता है, समानांतर में 5 अलग-अलग कार्यों को शुरू करता है और उन सभी का इंतजार करता है, थ्रेड पूल में आने वाले अनुरोधों को संभालने के लिए 50 - 1 - 5 = 44 मुक्त धागे होंगे - इसलिए यह समानता है, हम एकल के लिए प्रदर्शन में सुधार कर सकते हैं अनुरोध करें, लेकिन हम उन अनुरोधों की संख्या को कम करते हैं जिन्हें संसाधित किया जा सकता है। तो एएसपी.नेट में अनुरोध प्रसंस्करण के अनुसार मुझे लगता है कि किसी भी तरह से कार्य शुरू होता है IO पूरा होने वाला थ्रेड एसिंक (टीएपी) का लक्ष्य प्राप्त कर सकता है। लेकिन IO पूर्णता धागा इस मामले में थ्रेड पूल थ्रेड को वापस कैसे कॉल करता है?
'प्रतीक्षा' इस प्रश्न के लिए कुछ मूल्यवान उत्तर। – Xmindz