2012-12-03 18 views
7

संभव डुप्लिकेट:
Why does the async keyword exist"async" विधि के अंदर "प्रतीक्षा" क्यों होना चाहिए?

मैं दो तरीकों की है। एक सामान्य विधि है (MyMethod) और एक एसिंक विधि (MyMethodAsync) है। मुझे एक संकलन त्रुटि मिलती है।

static string MyMethod() 
{ 
    var result = await MyMethodAsync(); // compile error here 
    return result; 
} 

async static Task<string> MyMethodAsync() 
{ 
    /** perform my logic here... **/ 
    Thread.Sleep(1000); 

    return "yes"; 
} 

त्रुटि संदेश

'का इंतजार है' ऑपरेटर केवल एक async विधि के भीतर इस्तेमाल किया जा सकता है। इस विधि को 'async' संशोधक के साथ चिह्नित करने और इसके कार्य प्रकार को 'कार्य' में बदलने पर विचार करें।

मैं उलझन में हूं। जब मैं await कीवर्ड का उपयोग करता हूं, तो कॉलिंग थ्रेड निलंबित कर दिया जाएगा और कार्य पूर्ण होने की प्रतीक्षा की जाएगी। तो एक बार await उपयोग में है, विधि अब एक async विधि नहीं है। सही?

टिप्पणी: मुझे पता है कि मुझे तर्क चाहिए कि मुझे MyMethod और MyMethodAsyncMyMethod पर कॉल करना चाहिए जो मैं चाहता हूं।

उत्तर

2

अंतर्दृष्टि की एक बड़ी राशि के लिए के रूप में कैसे async और इंतजार काम आंतरिक रूप से करने के लिए, जॉन स्कीट के EduAsync ब्लॉग श्रृंखला की जाँच: msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx

यह MSDN लेख भी यह बताते हैं: http://msdn.microsoft.com/en-us/library/vstudio/hh156513.aspx

मूल रूप से: एक विधि द्वारा संशोधित async कीवर्ड में कम से कम एक प्रतीक्षा अभिव्यक्ति या कथन शामिल है। विधि पहली बार प्रतीक्षा अभिव्यक्ति तक पहुंचने तक सिंक्रनाइज़ हो जाती है, जिस बिंदु पर इसे प्रतीक्षा किए जाने तक कार्य निलंबित कर दिया जाता है। इस बीच, विधि के कॉलर पर नियंत्रण वापस कर दिया जाता है। यदि विधि में प्रतीक्षा अभिव्यक्ति या कथन शामिल नहीं है, तो यह सिंक्रनाइज़ निष्पादित करता है।

अंत में, इस MSDN लेख: http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx एक कदम-दर-कदम उदाहरण के माध्यम से चलता है, पेज नीचे रास्ते से के बारे में 1/3:

4

async कीवर्ड की पूरी बिंदु await कीवर्ड सक्षम बनाना है।

मैंने कई "कीवर्ड इस तरह काम क्यों करते हैं?" एकत्र किए प्रश्न on my blog। " क्यों नहीं await की उपस्थिति से अनुमानित नहीं हो सकता है?" answered conclusively by Eric Lippert on his blog था। संक्षेप में, दो कारण: पीछे की संगतता और कोड पठनीयता।

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