2016-06-24 11 views
12

त्वरित सवाल .."async कार्य तो इंतजार है टास्क" बनाम "टास्क तो लौट कार्य"

आदेश अतुल्यकालिक प्रोग्रामिंग और await मुझे पता है कि इन के बीच अंतर है क्या चाहते हैं के बारे में कुछ ठोस आधार समझ पाने के लिए दो कोड स्निपेट जब यह बहु सूत्रण और निष्पादन अनुक्रम और समय की बात आती है:

यह:

public Task CloseApp() 
{ 
     return Task.Run(
         ()=>{ 
           // save database 
           // turn off some lights 
           // shutdown application 
          }); 
} 

इस बनाम:

public async Task CloseApp() 
{ 
     await Task.Run(
         ()=>{ 
           // save database 
           // turn off some lights 
           // shutdown application 
          }); 
} 

अगर मैं इस दिनचर्या में यह बोल रहा हूँ:

private async void closeButtonTask() 
{ 
    // Some Task 1 
    // .. 

    await CloseApp(); 

    // Some Task 2 
    // .. 
} 
+1

वे * अपवाद लिपटे रहे – SLaks

+0

संभावित शिकार http://stackoverflow.com/questions/21033150/any-difference-between-await-task-run-return-and-return-task-run – DavidG

उत्तर

11

यह लगभग वही है (थ्रेड इत्यादि के मामले में)। लेकिन दूसरे के लिए (await का उपयोग करके) कंपाइलर द्वारा बहुत अधिक ओवरहेड बनाया जाएगा।

तरीके async रूप में घोषित किया और await का उपयोग कर संग्राहक द्वारा राज्य मशीन में बदला जाता है। तो जब आप await पर क्लिक करते हैं, तो नियंत्रण प्रवाह कॉलिंग विधि पर वापस कर दिया जाता है और await के बाद Task समाप्त होने के बाद आपके async विधि को निष्पादित किया जाता है।

चूंकि आपके await के बाद कोई और कोड नहीं है, तो await का उपयोग करने की कोई आवश्यकता नहीं है। बस Task वापस पर्याप्त है।

+0

* "जब आप प्रतीक्षा करते हैं, तो नियंत्रण प्रवाह कॉलिंग विधि पर वापस आ जाता है" * - नियंत्रण प्रवाह ** ** कॉलिंग विधि पर वापस लौटाया जा सकता है, विशेष रूप से यह तब तक वापस नहीं आएगा जब प्रतीक्षा कार्य पहले ही पूरा हो चुका है । विवरण के लिए – acelent

+0

@acelent thx, कभी नहीं सोचा कि कार्य कब समाप्त हो चुका है। मुझे कंपाइलर लाइन से लाइन के बारे में सटीक जानकारी नहीं जानता है। –

4

दो दृष्टिकोणों के बीच बहुत कुछ मतभेद हैं। असल में, वे वही अर्थशास्त्र साझा करते हैं। हालांकि, async/await के साथ संस्करण बाहरी कंपाइलर-जेनरेट किए गए कार्य में आंतरिक कार्य के निष्पादन को लपेटता है। गैर-एसिंक संस्करण नहीं है। इस प्रकार, गैर-एसिंक संस्करण (बहुत मामूली) अधिक कुशल है।

+0

में सूक्ष्म अंतर है "गैर-एसिंक संस्करण (बहुत मामूली) अधिक कुशल है।" * - यह निर्भर करता है कि अगर विधि को अक्सर कहा जाता है, तो एसिंक/प्रतीक्षा संस्करण ध्यान देने योग्य कचरा उत्पन्न कर सकता है: राज्य मशीन और दूसरा कार्य। – acelent

+0

@acelent: कुछ पीढ़ी 0 कचरा पैदा करना अभी भी मेरे लिए बहुत ही मामूली लगता है – Falanwe

+0

ठीक है, मैं बस यह इंगित करना चाहता हूं कि हमेशा हर किसी के लिए मामला नहीं है ([1] (https://msdn.microsoft.com/en-us /magazine/hh456402.aspx)), और आप उन कार्यों के कार्यों या संदर्भों पर भरोसा नहीं कर सकते हैं जो कि अल्पकालिक ([2] (https://channel9.msdn.com/Events/Build/BUILD2011/TOOL-829T) , [0:25:40 पर] (https://channel9.msdn.com/Events/Build/BUILD2011/TOOL-829T#time=25m40s), [0:30:20 बजे] (https: // channel9। msdn.com/Events/Build/BUILD2011/TOOL-829T#time=30m20s))। – acelent

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