2015-10-11 13 views
6

दो प्रश्नों और बहुत भ्रम के बाद - मुझे आश्चर्य है कि मुझे अंत में यह सही मिला।async/प्रतीक्षा - क्या यह समझ सही है?

async/awaitकेवल एक ही उद्देश्य में कार्य करता है - कोड के बाद निष्पादित करने के लिए अनुमति देने के लिए एक पहले से ही अतुल्यकालिक कार्य समाप्त हो गया है: यह मेरी समझ है। उदा।

async Task CallerMethod() 
{ 
    await AsyncMethod(); 
    AnotherMethod(); 
} 

की अनुमति देता है के बाद अतुल्यकालिक AsyncMethodAsyncMethod के बाद के बजाय तुरंत समाप्त हो गया है शुरू कर दिया है AnotherMethod निष्पादित किया जाना है।

async/ कुछ भी अतुल्यकालिक बनाता है। यह एक अलग थ्रेड शुरू नहीं करता है (जब तक प्रतीक्षा की गई विधि वैसे भी नहीं होती है), आदि

क्या मेरी समझ (अंत में) सही है?

+2

हाँ जो सही के बारे में लगता है - लेकिन कृपया ध्यान दें कि यदि आप 'AsyncMethod' थ्रेड नहीं बढ़ाते हैं तो भी आप किसी अन्य थ्रेड पर समाप्त हो सकते हैं - आपकी कॉलबैक किसी भी थ्रेडपूल-थ्रेड – Carsten

+0

@ करस्टन धन्यवाद में उत्पन्न की जा सकती है। मान लीजिए कि 'कॉलबैक' से आपका मतलब है 'अन्य विधि();' - इसका एक बहुत ही महत्वपूर्ण प्रभाव होगा - कि मैं इससे यूआई अपडेट नहीं कर सका - क्या यह वाकई सच है? – ispiro

+1

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

उत्तर

15

हालांकि स्टीफन का जवाब सही है, मैं यह सुनिश्चित करना चाहता हूं कि आपके पास कुछ अतिरिक्त अंक स्पष्ट हैं।

async/इंतजार कभी नहीं कुछ भी अतुल्यकालिक

यह CallerMethod एक अतुल्यकालिक विधि बनाता है बनाता है। CallerMethodTask लौटाता है जिसे स्वयं ही इंतजार किया जा सकता है, और CallerMethodCallerMethod के काम से पहले उस कार्य को वापस कर देता है, इसलिए यह एक असीमित विधि है।

यह AsyncMethod असीमित नहीं बनाता है; यह पहले से ही असीमित था।

यह एक अलग थ्रेड

सही शुरू नहीं करता है। यह भ्रम का लगातार स्रोत है। थ्रेड समरूपता की एक इकाई है, जो केवल एक प्रकार का एसिंक्रोनि है। एक समानता आमतौर पर मदद करता है। आप रोटी को टोस्टर में डाल सकते हैं, इसे टोस्ट करने के लिए इंतजार कर सकते हैं, और फिर अंडे बना सकते हैं। आप रोटी को टोस्टर में डाल सकते हैं, टोस्ट टोस्ट करते समय अंडे पका सकते हैं, और फिर अंडे के बाद टोस्ट से निपट सकते हैं। या आप दो कुक किराए पर ले सकते हैं, एक अंडे पका सकते हैं और एक टोस्ट बनाने के लिए। पहला तुल्यकालिक प्रसंस्करण है। दूसरा और तीसरा असीमित है, लेकिन केवल तीसरा समवर्ती है। ध्यान दें कि तीसरा समाधान सबसे महंगा है; धागे श्रमिक और कर्मचारी सस्ते नहीं हैं।

एसिंक्रोनस विधि एसिंक्रोनस क्या करता है यह नहीं है कि यह समवर्ती है - हालांकि यह हो सकता है। यह अतुल्यकालिक बनाता है कि यह आपको एक तंत्र देता है जो आपको कुछ और करने की अनुमति देता है जबकि आप को पूरा करने के लिए अपने काम की प्रतीक्षा कर रहे हैं। await लिखने का एक सुखद तरीका है "यहां कोड है जिसे मैं सफलतापूर्वक पूरा कर लेने के बाद चलाने के लिए चाहता हूं"।

+0

धन्यवाद। हालांकि, मुझे लगता है कि जब कुछ "थ्रेड" कहते हैं - वे (हम) वास्तविक धागे का जिक्र नहीं कर रहे हैं (जैसा कि आपके तीसरे समानता में)। वे इसके बजाय, किसी भी समय दो परिचालनों का जिक्र करते हैं, जो आपके दूसरे और तीसरे अनुरूपों को एक साथ जोड़ते हैं। तो क्या यह एक वास्तविक धागा है, या बस डिस्क ड्राइव काम कर रहा है - वे इस "multithreading" पर विचार करेंगे। वैसे भी - यहां किसी भी चीज के बारे में बहस नहीं करना, यह केवल कुछ (शायद सही) जानकारी है जो दूसरों की मदद करने में आपकी मदद कर सकती है। एक बार फिर धन्यवाद! – ispiro

+2

@ispiro: वह अपने आप में एक आम गलतफहमी का संकेत देता है; स्टीफन के पास इस विचार को खारिज करने का एक अच्छा लेख है कि हार्डवेयर I/O किसी भी तरह से बहुप्रचारित है, और मैं निश्चित रूप से आपको इसका संदर्भ देने से बेहतर नहीं कर सकता। "स्टीफन क्लेरी पर कोई धागा नहीं है" पर एक खोज करें, और आपको यह मिल जाएगा। –

+1

यह अर्थशास्त्र है, लेकिन मुझे लगता है कि * समवर्ती * यहां सबसे अच्छा शब्द नहीं है। हम आमतौर पर दूसरे और तीसरे विकल्प समवर्ती दोनों को कॉल करेंगे क्योंकि 2 ऑपरेशन एक ही समय में किए जा रहे हैं लेकिन केवल तीसरे * समांतर * को कॉल करते हैं क्योंकि इसे समानांतर में चलने वाले एकाधिक शेफ (या थ्रेड) की आवश्यकता होती है। इसलिए अभिव्यक्ति: "एकल थ्रेड कंसुरेंसी"। – i3arnon

7

async/प्रतीक्षा कभी भी असीमित नहीं करता है। यह एक अलग थ्रेड शुरू नहीं करता है (जब तक प्रतीक्षा की गई विधि वैसे भी नहीं होती है), आदि

हां।

एक और तरीका रखें, async/await एक असीमित परिप्रेक्ष्य से कोड लिखने में सक्षम बनाता है। यही है, कोड "असीमित रूप से प्रतीक्षा कर सकता है" (await) परिचालन को पूरा करने के लिए, और बदले में अपने स्वयं के एसिंक्रोनस ऑपरेशन को परिभाषित कर सकता है (कार्य async विधि से लौटाया गया है, जो उस विधि के निष्पादन का प्रतिनिधित्व करता है)।

संबंधित मुद्दे