इस पोस्ट पर असंतुष्ट वेब अनुरोध करने की बात करता है।
अब सादगी एक तरफ, अगर वास्तविक दुनिया में, आप सभी एक async अनुरोध करते हैं और इसके लिए अगली पंक्ति में प्रतीक्षा करते हैं, तो क्या यह पहली जगह में सिंक कॉल करने के समान नहीं है?
इस पोस्ट पर असंतुष्ट वेब अनुरोध करने की बात करता है।
अब सादगी एक तरफ, अगर वास्तविक दुनिया में, आप सभी एक async अनुरोध करते हैं और इसके लिए अगली पंक्ति में प्रतीक्षा करते हैं, तो क्या यह पहली जगह में सिंक कॉल करने के समान नहीं है?
जवाबों:
नहीं, निरंतरता केasync + await != sync
कारण
MSDN 'एसिंक्रोनस और Await (C # और विजुअल बेसिक) के साथ अतुल्यकालिक प्रोग्रामिंग "से
Async पद्धतियों का उद्देश्य गैर-अवरोधक संचालन होना है। एक async विधि में एक प्रतीक्षित अभिव्यक्ति वर्तमान थ्रेड को ब्लॉक नहीं करती है जबकि प्रतीक्षित कार्य चल रहा है। इसके बजाय, अभिव्यक्ति शेष विधि को एक निरंतरता के रूप में संकेत देती है और एस्किंस विधि के कॉलर को नियंत्रण वापस करती है ।
उदाहरण के लिए async निष्पादन UI थ्रेड को ब्लॉक नहीं करेगा, और Some TextBox.Text
डाउनलोड समाप्त होने के बाद अपडेट किया जाएगा
private async void OnButtonClick()
{
SomeTextBox.Text = await new WebClient().DownloadStringTaskAsync("http://stackoverflow.com/");
}
Console.WriteLine(await GetStringOverNetwork());
? क्या होगा यदि आपको अतुल्यकालिक आह्वान के उत्पादन की आवश्यकता है? क्या प्रोग्राम पहली पहुंच पर ब्लॉक करेगा, भले ही धागा संभावित रूप से निष्पादन को जारी रख सके?
नहीं, यह समान नहीं है।
आपका async
कोड ब्लॉक await
जारी रखने के लिए कॉल के लौटने की प्रतीक्षा कर रहा है, हालांकि आपके बाकी एप्लिकेशन प्रतीक्षा नहीं कर रहे हैं और अभी भी सामान्य की तरह जारी रह सकते हैं।
इसके विपरीत, एक तुल्यकालिक कॉल आपके पूरे एप्लिकेशन या थ्रेड को तब तक प्रतीक्षा करेगा जब तक कि कोड किसी अन्य चीज़ के साथ जारी रखने के लिए निष्पादित नहीं हो जाता।
कृपया मुझे async / प्रतीक्षा के संबंध में चीजों को स्पष्ट करने की अनुमति दें।
जब प्रतीक्षा का सामना करना पड़ता है तो अंतर्निहित राज्य मशीन नियंत्रण को तुरंत वापस करने की अनुमति देती है। फिर, जब प्रतीक्षित कॉल पूरी हो जाती है, तो अंतर्निहित राज्य मशीन आवेगित कॉल के बाद लाइन पर फिर से शुरू करने की अनुमति देती है।
इसलिए, Async ब्लॉक अवरुद्ध नहीं है और न ही यह प्रतीक्षा कॉल समाप्त होने की प्रतीक्षा कर रहा है; प्रतीक्षा आदेश का सामना होने पर नियंत्रण तुरंत वापस आ जाता है।
अंतर्निहित राज्य मशीन async / प्रतीक्षा के उपयोग के पीछे "जादू" का हिस्सा है जो कि अप्रयुक्त और छूटी नहीं है।
मैं मन में एक ही सवाल के साथ इस पर ठोकर खाई, फिर भी प्रतिक्रियाओं को पढ़ने के बाद सवाल लंजर लगता है, "हुड के नीचे जादू" के संदर्भ में भ्रमित।
उपर्युक्त अतुल्यकालिक प्रोग्रामिंग से :
async
कीवर्ड एक async विधि है, जो आप का उपयोग करने की अनुमति देता में एक विधि बदल जाता हैawait
उसके शरीर में कीवर्ड।- जब
await
कीवर्ड लागू किया जाता है, तो यह कॉलिंग विधि को निलंबित कर देता है और जब तक प्रतीक्षित कार्य पूरा नहीं हो जाता है, तब तक इसकी कॉलगर्ल को नियंत्रित करता है।await
केवल एकasync
विधि के अंदर इस्तेमाल किया जा सकता है ।
क्या संदर्भ है कि मुठभेड़ों await
को अवरुद्ध किया जाता है?
क्या बाकी का आवेदन ब्लॉक में है await
?
यह इस बात पर निर्भर करता है कि आपका आवेदन कैसे लिखा गया है। यदि यह एक await
ही संदर्भ में क्रमिक रूप से लॉन्च किए गए निर्भर एड कार्यों की एक श्रृंखला है (देखें: कुछ async / प्रतीक्षा व्यवहार को समझने की कोशिश कर रहा है )
await asyncCall1();
await asyncCall2(); // waits for asyncCall1() to complete
इस तरह से प्रत्येक await
अगले एक की स्पॉनिंग को ब्लॉक करेगा।
दूसरी ओर, समानांतर में लॉन्च किए गए समान आश्रित कार्य समानांतर में निष्पादित होंगे और संदर्भ केवल सम्मान पर अवरुद्ध होंगे। await
:
Task<int> t1 = asyncCall1();
Task<string> t2 = asyncCall2(); // runs in parallel with asyncCall1()
int val = await t1;
string str = await t2; // waits for asyncCall1() to complete
सामान्य तौर पर, await
पैदावार बाहरी संदर्भ में निष्पादित होती है, जहां से वर्तमान संदर्भ कहा जाता है। हालाँकि, यदि बाहरी संदर्भ स्वयं वर्तमान की प्रतीक्षा कर रहा है, तो यह await
उसी संदर्भ में क्रमबद्ध s की तरह है ।
इसलिए, async
लाभों को पुनः प्राप्त करने के लिए, किसी को कई समानांतर संदर्भों (यूआई, डेटा-क्लाइंट आदि) को चलाने के लिए एप्लिकेशन को डिज़ाइन करने की आवश्यकता होती है, फिर await
एक संदर्भ में अन्य संदर्भों के लिए निष्पादन होता है, इसलिए संपूर्ण एप्लिकेशन किसी व्यक्ति पर ब्लॉक नहीं होगा await
।