2014-09-08 13 views
6

क्या कोई जानता है कि ऐसा करने का उद्देश्य क्या है?सी # प्रतीक्षा/async, बिंदु क्या है?

private async Task<bool> StoreAsync(TriviaAnswer answer) { ... } 

[ResponseType(typeof(TriviaAnswer))] 
public async Task<IHttpActionResult> Post(TriviaAnswer answer) 
{ 
    var isCorrect = await StoreAsync(answer); 
    return Ok<bool>(isCorrect); 
} 

इस की जांच से, यह निजी विधि एसिंक्रोनस रूप से चलाने के लिए यह कह रहा है लेकिन तुल्यकालिक इसे समाप्त करने के लिए प्रतीक्षा करें। मेरा सवाल है, क्या इसका कोई मतलब है? या यह सिर्फ एक फैंसी अभी तक व्यर्थ तकनीक है? मैं वेब एपीआई/एमवीसी/एसपीए के लिए कुछ कोड का अध्ययन करते समय इसमें भाग गया।

वैसे भी, कोई अंतर्दृष्टि उपयोगी होगी।

+0

1) कृपया 'MyMethod() 'का रिटर्न प्रकार दिखाएं, यह महत्वपूर्ण है। और 2) सिंक्रोनस प्रतीक्षा का उल्लेख कहां है, आपके उदाहरण कोड में एक नहीं है। –

+0

मेरा मानना ​​है कि समकालिक प्रतीक्षा 'प्रतीक्षा' में होती है। मैं जल्द ही कोड अपडेट करूंगा। – beautifulcoder

+2

'प्रतीक्षा' का विघटन एक असीमित प्रतीक्षा है। एक सिंक्रोनस प्रतीक्षा 'var isCorrect = StoreAsync (उत्तर) होगा। परिणाम; ' –

उत्तर

8

इसके नाम के बावजूद, await वास्तव में Thread.Join की तरह काम नहीं करता है। async और await माइक्रोसॉफ्ट के coroutines का कार्यान्वयन है, जो निरंतर पासिंग स्टाइल का उपयोग करके लागू किया गया है। कार्य को फिर से व्यवस्थित किया जाता है ताकि Task<T> पूरा होने पर प्रसंस्करण जारी रहे। एसिंक्रोनस ऑपरेशन का अधिकतम उपयोग करने के लिए संकलक द्वारा निर्देशों को फिर से व्यवस्थित किया जाता है।

This article यह thusly बताते हैं:

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

कुछ मामूली कोड उदाहरणों के लिए, await वास्तव में बहुत अधिक समझ में नहीं आता है, क्योंकि ऐसा कोई अन्य काम नहीं है जब आप प्रतीक्षा कर रहे हों।

+0

_there कोई अन्य काम नहीं है जिसे आप प्रतीक्षा करते समय कर सकते हैं ._ क्या आप इसे और समझा सकते हैं? यदि 'पोस्ट' पर एकाधिक कॉल किए जाते हैं तो थ्रेड पूरा करने के लिए प्रतीक्षा किए बिना अनुरोध को पूरा करना शुरू कर सकता है। – Shoe

+0

रॉबर्ट, मैंने इकट्ठा किया था कि एसिंक/प्रतीक्षा का उपयोग करके, आप धागे को मुक्त कर रहे हैं ताकि वे कार्य पूरा होने तक अन्य अनुरोधों को जा सकें और संभाल सकें। यह आपके एप्लिकेशन को अधिक कुशल बनाकर समग्र प्रदर्शन में सुधार करेगा (यानी प्रत्येक थ्रेड अधिक कुशल नहीं है; उपयोगकर्ता इसे नोटिस नहीं करेंगे, बल्कि आप सर्वर पर इसे आसान बना रहे हैं)। क्या इसमें कोई सच है या क्या मैंने इस बिंदु को याद किया है? –

+0

@ रोवन फ्रिमैन: मैं कहूंगा कि, थ्रेड निष्पादित करने वाले निर्देशों को फिर से क्रमबद्ध करके, आप उन्हें अधिक कुशलता से काम कर रहे हैं, और इसलिए आपको उनमें से कम काम करने की आवश्यकता है। आपके पास धागे अक्सर कम हो रहे हैं क्योंकि वे अब कॉल को पूरा करने के लिए अवरुद्ध करने की प्रतीक्षा नहीं कर रहे हैं। –

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