2014-04-20 15 views
6

मैं एसिंक/प्रतीक्षा का अच्छा समझ पाने की कोशिश कर रहा हूं और मैं कुछ भ्रम को साफ़ करना चाहता हूं। किसी कृपया समझा सकते हैं कि निम्नलिखित के लिए निष्पादन के मामले में अंतर हो जाएगा:Async/Await निष्पादन अंतर

// version 1 
public Task Copy(string source, string destination) { 
    return Task.Run(() => File.Copy(source, destination)); 
} 

public async Task Test() { 
    await Copy("test", "test2");  
    // do other stuff 
} 

और:

// version 2 
public async Task Copy(string source, string destination) { 
    await Task.Run(() => File.Copy(source, destination)); 
} 

public async Task Test() { 
    await Copy("test", "test2"); 
    // ... 
} 

वे एक ही कोड में जिसके परिणामस्वरूप कर रहे हैं और कारण है कि मैं एक दूसरे के ऊपर लिखना चाहते हैं?

+1

संभावित रूप से एक डुप्लिकेट: http://stackoverflow.com/q/21033150/1768303 – Noseratio

+1

@ नोसेरेटियो हाँ, यह वास्तव में भी है, एरिक्स का जवाब एक "आंख खोलने वाला" है, जो डुप्ली के लिए खेद है, कुछ भी नहीं मिला (वास्तव में यह सुनिश्चित नहीं है कि खोज कैसे बनाएं: पी) –

+2

@ डिमिटार डिमिट्रोव, आईएमओ, राज्य मशीन के ओवरहेड के अलावा, सबसे प्रमुख अंतर [अपवाद प्रचार तर्क] (http://stackoverflow.com/a/21082631/1768303) है । – Noseratio

उत्तर

8

सबसे पहले मुझे इस बिंदु से शुरू करने दें कि दोनों कोड समान नहीं हैं।

आपका संस्करण 1 कोड केवल एक "राज्य मशीन" बनाएगा क्योंकि इसमें केवल Test विधि में प्रतीक्षा है।

आपका संस्करण 2 कोड Copy और Test विधि के लिए दो "राज्य मशीन" बनाएगा जो कुछ ओवरहेड जोड़ता है।

हम async विधियों का उपयोग क्यों करते हैं? "असीमित कार्य" से निपटने के दौरान हमारे कोड को पढ़ने योग्य, सुरुचिपूर्ण बनाने के लिए सरल। इससे हमारे कोड बेहतर कॉलबैक और निरंतरता आदि

के टूट क्या Copy विधि कर रही है चलो से परहेज करता है और हम सवाल का जवाब है कि क्या हम वास्तव में इसकी जरूरत async होने के लिए?

Copy विधि बस Task.Run करने के लिए कॉल जो एक काम है कि अंततः File.Copy के पूरा होने पर पूरा होने तक पहुँच जाता है रिटर्न प्रतिनिधियों। तो इरादा स्पष्ट है कि हमें एक कार्य की आवश्यकता है जो File.Copy पूरा करने को सूचित करता है। यह विधि आपको जो चाहिए वह सब कुछ करता है, उम्मीद के अनुसार काम करने के लिए async होने की आवश्यकता नहीं है।

तो, आपको async कब चाहिए?

आपको पहले कार्य के पूर्ण होने (निरंतरता) पर कुछ कोड निष्पादित करने की आवश्यकता होने पर आपको async की आवश्यकता है।

उदाहरण:

public async Task Test() 
{ 
    await Copy("test", "test2"); 
    DoPostCopied(whatever); 
    await DoPostCopied2();//Etc 
} 

तुम बस decompiling दोनों संस्करणों द्वारा async और गैर async विधि के बीच इस अंतर को सत्यापित कर सकते हैं। यह बहुत लंबा है और पठनीय नहीं होगा इसलिए मैंने इसे यहां पोस्ट करना छोड़ दिया।

निष्कर्ष: का उपयोग केवल तभी करें जब आवश्यक। इस मामले में संस्करण 1 बेहतर है और आपको इसे संस्करण 2 पर प्राथमिकता देना चाहिए।

+0

+1 यह इंगित करने के लिए कि वे एक ही –

+1

@AmitJoki नहीं मानते हैं कि हमें ओप के लिए +1 के साथ-साथ दिलचस्प प्रश्न –

+0

के लिए +1 देने की आवश्यकता है। दरअसल यह एक अच्छा सवाल था –

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