2015-09-09 22 views
20

तो यहाँ परिदृश्य है:जब मैं "async" विधि का "इंतजार" करता हूं तो यह तुल्यकालिक हो जाता है?

static async void Main(string[] args) 
{ 
    await AnAsyncMethod(); 
} 

private static async task<bool> AnAsyncMethod() 
{ 
    var x = await someAsyncMethod(); 
    var y = await someOtherAsyncMethod(); 

    return x == y; 
} 

है "someAsyncMethod" और "someOtherAsyncMethod" तुल्यकालिक चल रहा है क्योंकि हम इंतजार का उपयोग कर रहे हैं, या वे दोनों आदेश है कि वे निष्पादित किया जा रहा में अतुल्यकालिक रूप से चल रहे हैं?

अद्यतन

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

+5

छोटे sidenote 'Main' उपयोग नहीं कर सकते' await' के रूप में अपनी ही '@Jamiec टिप्पणी की चोटी पर – Jamiec

+0

async', यदि आप किसी अन्य अन्य वर्ग बना सकते हैं और वहाँ में कि async विधि डाल के रूप में चिह्नित नहीं, तो आप कॉल कर सकते हैं । अपने मुख्य विधि, 'नई SomeClass() AnAsyncMethod.Wait() में,' और यह होगा एसिंक्रोनस रूप –

+1

मेरे समझ के साथ कि someAsyncMethod पूरी तरह से पहले someOtherAsyncMethod शुरू होगा खत्म होता है। – Biscuits

उत्तर

27

वे एसिंक्रोनस रूप से चल रहे हैं लेकिन क्रमिक रूप सेsomeOtherAsyncMethod को someAsyncMethod समाप्त होने तक नहीं बुलाया जाएगा।

मैं पिछले प्रयोग में मूल एप्लिकेशन को देखा है इंतजार:

आप समानांतर में उन्हें चलाना चाहते हैं, तो आप कई विकल्प

var taskA = MethodA(); 
var taskB = MethodB(); 

var a = await taskA; 
var b = await taskB; 

// or 

var results = await Task.WhenAll(MethodA(), MethodB()); 

फ़ॉलो-अप सवाल है/async यूआई थ्रेड को मुक्त करने के साधन के रूप में, लेकिन क्या कोई अन्य कारण हैं कि यह डिज़ाइन वांछनीय क्यों होगा?

ASP.NET अनुप्रयोग में, आप इस का उपयोग करने के लिए वर्तमान धागा ThreadPool के लिए वापस जाओ और अन्य आने वाले अनुरोधों को पेश करने की अनुमति चाहता हूँ, जबकि MethodA/MethodB चल रहे हैं - अगर इन तरीकों सच कर रहे हैं async I/O। यह मूल रूप से एकमात्र कारण है कि आप इसे एएसपी.NET ऐप में क्यों करेंगे।

तुम भी स्टीफन Cleary के पढ़ने के लिए चाहते हो सकता है:

+2

ध्यान दें कि आप कार्य का उपयोग नहीं कर सकते हैं। जब भी एक ही संदर्भ पर mutliple ईएफ कॉल के साथ। वह निश्चित रूप से मुझे पहले काट दिया है। –

+4

और न केवल एएसपी.नेट में - किसी भी बहु-उपयोगकर्ता सर्वर एप्लिकेशन में, आपको अपनी थ्रेड गिनती कम रखने से लाभ होगा। प्रत्येक थ्रेड का मतलब गैर-नगण्य स्मृति और सीपीयू उपयोग होता है - यदि आपके पास 4000 धागे हैं, तो आप डिफ़ॉल्ट थ्रेड स्टैक पर 4 जीबी मेमोरी (उम्मीद है कि कम से कम गैर-कम से कम) खो गए हैं। और चूंकि आप केवल सीपीयू कोर के रूप में वास्तव में बहुत से धागे हैं, देते हैं या लेते हैं, यह एक पूरी तरह से अनावश्यक अपशिष्ट है। यह 32-बिट अनुप्रयोग में विशेष रूप से सच है, जहां * वर्चुअल * मेमोरी की मात्रा भी सीमित है। – Luaan

+0

@Luaan परिशिष्ट के लिए धन्यवाद, बहुत उपयोगी! – dcastro

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