2012-04-20 11 views
16

पर प्रतीक्षा करें अभी भी async-await के बारे में सीखना। मैंने निम्नलिखित उदाहरणों में बंप किया:अंतिम विधि रेखा

public async Task MethodAsync() 
{ 
    await Method01Async(); 
    await Method02Async(); 
} 

अंतिम प्रतीक्षा का उद्देश्य क्या है? Method02Async MethodAsync विधि की अंतिम पंक्ति है। तो कोई भी विधि शेष नहीं है - नीचे कोई भी रेखा नहीं - कंपाइलर द्वारा उत्पन्न कॉलबैक में कुछ भी नहीं कहा जाना चाहिए ... क्या मुझे कुछ याद आ रही है?

उत्तर

17

वास्तव में एक "विधि शेष" है - यह TaskMethodAsync द्वारा लौटाता है।

(Method02Async का वापसी मूल्य) का इंतजार है कि MethodAsyncMethod02Async पूरा होने तक पूरा नहीं हुआ है।

यदि आप था:

public async Task MethodAsync() 
{ 
    await Method01Async(); 
    Method02Async(); 
} 

फिर MethodAsync (अतुल्यकालिक रूप से) Method01Async के लिए पूरा करने के लिए इंतजार करेंगे और उसके बाद Method02Async शुरू करते हैं। MethodAsync तब पूरा हो जाएगा जबकि Method02Async अभी भी प्रगति पर हो सकता है।

जिस तरह से आप यह है:

public async Task MethodAsync() 
{ 
    await Method01Async(); 
    await Method02Async(); 
} 

मतलब है कि MethodAsync जाएगा (अतुल्यकालिक रूप से) Method01Async के लिए पूरा करने के लिए प्रतीक्षा करें और फिर (अतुल्यकालिक रूप से) को पूरा करने के Method02Async लिए प्रतीक्षा करें, और उसके बाद ही होगा MethodAsync पूरा।

+5

विशेष रूप से, कल्पना करें कि क्या विधि 02 एसिंक, कहें, कार्य। डेले (5000)। अगर किसी ने कहा कि "MethodAsync()" का इंतजार है और फिर वह कार्य पूरा हो गया * देरी से पहले * यह पूरा हो गया होगा! –

+0

लेकिन लिखना बेहतर नहीं है "वापसी विधि 02 एसिंक();" आखिरी पंक्ति के रूप में? – duduamar

+0

@duduamar: यह तब तक संकलित नहीं होगा जब तक आप 'MethodAsync' से' async' को हटा नहीं देते। जिसका अर्थ है कि आपको 'Method01Async' से 'प्रतीक्षा' को भी हटाना होगा। व्यवहार में काफी बदलाव। –

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