2017-12-03 47 views
5

एक async विधि को देखते हुए:async/प्रतीक्षा के लिए कॉल श्रृंखला ... प्रतीक्षा करने का इंतजार कर रहे हैं या प्रतीक्षा करने योग्य वापस?

public async Task<int> InnerAsync() 
{ 
    await Task.Delay(1000); 
    return 123; 
} 

और एक मध्यवर्ती विधि के माध्यम से यह बुला, मध्यवर्ती विधि async विधि (IntermediateA) या केवल लौटने कार्य (IntermediateB) का इंतजार करना चाहिए?

pubic async Task<int> IntermediateA() 
{ 
    return await InnerAsync(); 
} 

private Task<int> IntermediateB() 
{ 
    return InnerAsync(); 
} 

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

क्या यह सही है?

+3

अंतर अपवाद हैंडलिंग में है। बेहतर समझने के लिए मैं सुझाव देता हूं कि आप आंतरिक कार्य से अपवाद फेंकने का प्रयास करें और देखें कि चीजें कैसे काम करती हैं। –

+0

धन्यवाद। मैंने बिल्कुल अपवाद हैंडलिंग पर विचार नहीं किया। – MikeZ

+0

"ऐसा लगता है कि इंटरमीडिएटबी को बेहतर प्रदर्शन करना चाहिए" - हाँ, लेकिन अंतर कुछ नैनोसेकंड होगा। यह उत्पन्न बाइनरी में कुछ दर्जन बाइट भी बचा सकता है। –

उत्तर

6

इन दो दृष्टिकोणों में सूक्ष्म मतभेद हैं। यदि आप await असफल कार्य उस विधि में अपवाद फेंक दिया जाएगा, लेकिन यदि आप कार्य को उस विधि को मानते हैं और फिर await यह अपवाद उपभोक्ता विधि में फेंक दिया जाएगा। उपभोक्ता के कार्य की प्रतीक्षा करने के मामले में और एक और अंतर दुर्लभ है, और यदि यह देरी के साथ हुआ, तो कार्य प्रतीक्षा बिंदु पर समाप्त हो सकता है और राज्य मशीन को बाईपास कर सकता है।

+0

धन्यवाद। मैंने बिल्कुल अपवाद हैंडलिंग पर विचार नहीं किया। – MikeZ

+0

प्रदर्शन के बारे में क्या? क्या यह दो राज्य मशीन नहीं बना रहा है (आंतरिक इंतजार कर रहा है)? – Mardoxx

+0

कोशिश/पकड़ के बिना, अपवाद कॉलर को वैसे भी प्रचारित करेगा। क्या आप एक व्यावहारिक व्यावहारिक अंतर बता सकते हैं? –

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