2016-05-02 2 views
5

मैं निम्नलिखित विधि है जो (इकाई की रूपरेखा का प्रयोग करके) एक डाटाबेस में परिवर्तन करता है:एक ही विधि में एकाधिक प्रतीक्षाओं का उपयोग करने के प्रभाव?

public async Task<int> CommitAsync(Info info) 
{ 
    if (this.Database.Connection.State == ConnectionState.Closed) 
     await this.Database.Connection.OpenAsync(); 

    await SetInfo(info); 
    return await base.SaveChangesAsync(); 
} 

उपरोक्त विधि रूप में उपयोग करने के लिए सुरक्षित है, या मैं चाहिए:

  1. बचें का उपयोग कर async-await, या
  2. उपयोग ContinueWith

उत्तर

12

यह कई await expre है करने के लिए पूरी तरह से ठीक है एक ही async विधि में ssions - यह अन्यथा अपेक्षाकृत बेकार सुविधा होगी।

मूल रूप से, विधि पहले await तक पहुंचने तक सिंक्रनाइज़ेशन निष्पादित करेगी जहां प्रतीक्षा करने योग्य शामिल पहले से ही पूरा नहीं हुआ है। फिर यह कॉलर पर वापस आ जाएगा, जिसने बाकी एसिंक विधि को निष्पादित करने के लिए प्रतीक्षा करने के लिए निरंतरता स्थापित की है। निष्पादन बाद में एक और await अभिव्यक्ति जहां awaitable पहले से ही पूरा नहीं किया है पहुँच जाता है, एक निरंतरता है, पर कि awaitable की स्थापना आदि

हर बार विधि एक इंतजार से "शुरू", यह है जहाँ यह छोड़ दिया पर किया जाता है है बंद, एक ही स्थानीय चर आदि के साथ। यह संकलक द्वारा आपकी ओर से एक राज्य मशीन निर्माण द्वारा हासिल किया जाता है।

+0

के साथ समस्याओं को रोकता है क्या मेरी समझ सही है? यदि हमारे पास दो इंतजार के बाद कोड का इंतजार है, तो दूसरे इंतजार के लिए केवल दूसरी प्रतीक्षा के लिए निरंतरता होगी, अगर यह मामला नहीं था तो दूसरे इंतजार के बाद कोड दो बार चला होगा (पहला, पहले की निरंतरता के रूप में प्रतीक्षा करने योग्य और दूसरा दूसरा इंतजार करने के लिए एक निरंतरता के रूप में। – YakRangi

+0

@Rouftantical: हाँ, जैसा कि मैंने कहा था "यह कहां से निकलता है"। –

2

आपका कोड सही दिखता है। यह आपके कॉलर को उन क्षणों पर कुछ उपयोगी करने का मौका देता है, जो आप इंतजार कर रहे हैं, हर किसी के इंतजार के बाद व्यस्त इंतजार करने के बजाय।

जारी रखने के बजाय async-await का उपयोग करने की अच्छी बात यह है कि आपका कोड काफी तुल्यकालिक दिखता है। यह देखना आसान है कि बयान किस आदेश पर निष्पादित किया जाएगा। जारी रखें भी आपको ऑर्डर निर्दिष्ट करने देता है, लेकिन यह देखना थोड़ा मुश्किल है।

यदि कोई थ्रेड एसिंक प्रक्रिया में प्रवेश करता है तो यह प्रक्रिया को निष्पादित करता है जब तक कि यह प्रतीक्षा न हो जाए। प्रतीक्षा की गई प्रक्रिया समाप्त होने तक प्रतीक्षा करने के बजाय, आपके कॉलर को नियंत्रण दिया जाता है जो अगले वक्तव्य जारी रख सकता है जब तक कि वह प्रतीक्षा नहीं कर लेता, जहां उसके कॉलर को नियंत्रण दिया जाता है। एक बार जब कोई इंतजार कर रहा है और आपका OpenAsync थ्रेड समाप्त हो गया है ओपनएसिंक के बाद बयान जारी रखता है जब तक कि यह एक और इंतजार नहीं करता।

स्टैक ओवरफ्लो में कोई भी व्यक्ति (हां उसका नाम खो गया) ने मुझे breakfast metaphor में एसिंक-प्रतीक्षा प्रक्रिया को एक बार समझाया।

एक बहुत ही उपयोगी परिचय, Stephen Cleary about Async-await। आइए आपको यह भी समझने दें कि async-await InvokeRequired

+1

मुझे लगता है कि एरिक लिपर्ट के साथ नाश्ता रूपक शुरू किया गया था। यहां कुछ हिस्सों का एक लिंक है यह http://www.i-programmer.info/professional-programmer/i-programmer/7154-c-guru-an-interview-with-eric-lippert.html?start=1 मैं दोनों स्कीट का पालन कर रहा हूं , क्लेरी और लिपर्ट पिछले कुछ सालों में एक हॉक की तरह हैं। फल और पशु पिंजरे रूपक के कटोरे पर भी पढ़ना सुनिश्चित करें। – Zuzlx

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