2013-08-05 27 views
15

का इंतजार करने के बाद कोई कोड नहीं है, तो मैंने कुछ पढ़ा है, और लगता है कि मैंने सिस्टम के संबंध में प्रतीक्षा और एसिंक कीवर्ड की मूल बातें समझ ली हैं। थ्रेडिंग। कार्य।कार्यों की प्रतीक्षा: वापसी कार्य या प्रतीक्षा करें यदि

मुझे यकीन नहीं है कि मैं एक छोटे से मुद्दे पर सही हूं, हालांकि, मैं सत्यापन की तलाश कर रहा हूं या किसी के लिए मुझे सही करने के लिए देख रहा हूं।

मैं एक async विधि को लागू कर रहा हूँ, इस हस्ताक्षर के साथ:

public Task ProcessUploadedFile(FileInfo info, string contentType); 

जाहिर है, अगर मैं विधि के अंदर कुछ भी इंतजार करना चाहते हैं, मैं हस्ताक्षर में async कीवर्ड जोड़ने के लिए, की जरूरत है

मेरा सवाल यह है: यदि मेरी विधि आखिरी चीज है तो एक और एसिंक विधि कॉल करें, या कोई कार्य वापस करें, क्या इसका इंतजार करने में कोई बात है?

ईजी।

1:

public async Task ProcessUploadedFile(FileInfo info, string contentType) 
{ 
    foreach (var something in someCollection) 
    DoSomething(); 

    DoSomethingElse(); 

    await DoMethodAsync(); 
} 

2:

public Task ProcessUploadedFile(FileInfo info, string contentType) 
    { 
     foreach (var something in someCollection) 
     DoSomething(); 

     DoSomethingElse(); 

     return DoMethodAsync(); 
    } 

मैं शुरू में पूर्व लिखा था, लेकिन अब इंतजार जोड़ने में बिंदु देख सकते हैं। अगर मैं बाद में लिखना चाहता था, तो मैं वही काम पूरा करता हूं, और दोनों तरीकों के कॉलर अभी भी प्रतीक्षा कीवर्ड का उपयोग कर सकते हैं यदि वे चुनते हैं, नहीं?

क्या उपरोक्त में कोई अंतर है? कौनसा अच्छा है"?

उत्तर

16

await का उपयोग पूरा होने की प्रतीक्षा करते समय विधि निकाय को निष्पादित करने के लिए किया जाता है। यदि जारी रखने के लिए कुछ भी नहीं है, तो आपको प्रतीक्षा करने की आवश्यकता नहीं है।

आप ContinueWith ऑपरेशन के रूप में प्रतीक्षा (सरलीकृत) के बारे में सोच सकते हैं। इसलिए, आपकी पहली विधि की तरह कुछ है:

foreach (var something in someCollection) 
    DoSomething(); 

DoSomethingElse(); 

DoMethodAsync().ContinueWith(t => {}); 

अच्छा MSDN लेख जो what happens in async method का वर्णन करता है जो अच्छा कोड प्रवाह तस्वीर है नहीं है:

enter image description here

+1

बढ़िया है, कि मैं क्या सोचा है। धन्यवाद! –

+1

रुको। क्या मैं बस कुछ स्पष्टीकरण दे सकता हूं? मेरे कोड के आपके पुनर्लेखित संस्करण में, आपके पास कार्य में DoSomething() और DoSomethingElse() है। Factory.StartNew() ... क्या यह सही है? मैंने सोचा कि ये बिट्स कॉलर के समान थ्रेड पर सिंक्रनाइज़ेशन चलाएंगे? और यह DoMethodAsync() होगा। जारी रखें (टी => {} _); ? –

+1

@dark_perfect क्षमा करें, एक भीड़ में था। और हाँ, आप पूरी तरह से सही हैं। अपडेट किया गया कोड –

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