2017-02-15 27 views
5

चलो कहते हैं कि मैं एक विधि है कि एक और async विधि तुरंत कॉल या इसी तरह करते हैं:क्या पास-थ्रू एसिंक विधि वास्तव में प्रतीक्षा/async पैटर्न की आवश्यकता है?

//Main method 
public async Task<int> Foo1(int x) 
{ 
    var result = await DoingSomethingAsync(x); 
    return DoSomethingElse(result); 
} 
//other method 
public async Task<int> Foo2(Double double) 
{ 
    return await Foo1(Convert.ToInt32(double)); 
} 

कोई विशेष कारण है कि Foo2 जरूरतों/होना चाहिए है async/का इंतजार है, बस बुला लिए विरोध के रूप में:

//other method 
public Task<int> Foo3(Double double) 
{ 
    return Foo1(Convert.ToInt32(double)); 
} 

एक उपभोक्ता में, यह अभी भी प्रतीक्षा कर रहे थे जाएगा, likeso, की परवाह किए बिना:

int x = await Foo1(1); 
int x = await Foo2(1D); 
int x = await Foo3(1D); 

सभी उन बयानों होगा संकलन। क्या संकलक दो अलग-अलग तरीकों से अलग आईएल उत्पन्न करेगा?

उत्तर

6

यह निर्भर करता है। विशेष रूप से, Convert.ToInt32 फेंकता है तो अपवाद व्यवहार अलग है।

मैं एक पूरी blog post on the subject है, लेकिन सारांश में, मैं async/await यहाँ का प्रयोग करेंगे क्योंकि अपवाद लौटे काम पर रखा जाएगा। अन्यथा, अपवाद सीधे फेंक दिया जाएगा।

अपवाद फेंकना केवल पूर्व शर्त अपवादों के लिए स्वीकार्य है (यानी, यह एक डबल को पार करने के लिए एपीआई का उल्लंघन है जिसे एक int में परिवर्तित नहीं किया जा सकता है)। और फिर भी (पूर्व शर्त अपवादों के लिए) आप या तो अपवाद सीधे फेंक सकते हैं या उन्हें लौटे हुए कार्य पर रख सकते हैं।

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