2012-08-02 23 views
13

मैं एक लाइब्रेरी लिख रहा हूं जो किसी तृतीय पक्ष वेब सेवा कॉल को लपेटता है और लाइब्रेरी को नई async/प्रतीक्षा सुविधाओं का उपयोग करने की कोशिश कर रहा हूं। निम्नलिखित उदाहरण में एसिंक/प्रतीक्षा कीवर्ड का उचित उपयोग क्या है?Nesting async/await विधियों

public class MyApi 
{ 
    public Task<ApiResult> DoSomethingAsync() 
    { 
     return this.DoSomethingCore(); 
    } 

    public async Task<ApiResult> DoSomethingElseAsync() 
    { 
     return await this.DoSomethingCore(); 
    } 

    private async Task<ApiResult> DoSomethingCore() 
    { 
     var httpClient = new HttpClient(); 
     var httpResponseMessage = await httpClient.GetAsync("some url"); 
     var rawResultText = await httpResponseMessage.Content.ReadAsStringAsync(); 
     return new ApiResult(rawResultText);   
    } 
} 

मेरे फोन करने वाले DoSomethingAsync विधि, कि विधि भी async होना चाहिए और कीवर्ड्स से जोड़ रहे है इंतजार का इंतजार करने के लिए अनुमति देने के लिए? या यह ठीक है क्योंकि यह एक कार्य देता है? इस तरह के घोंसले के लिए एक बेहतर पैटर्न है?

मुझे लगता है कि DoSomethingAsync विधि यहां जाने का सही तरीका है, क्या यह सही है? मेरा मानना ​​है कि पुस्तकालय बनाने के दौरान DoSomethingElseAsync गलत दृष्टिकोण प्रतीत होता है।

+0

सी # 5.0 मौजूद नहीं है, अगला संस्करण 4.5 है, क्या इसका मतलब यह है? –

+9

@ रामहाउंड - अगला सीएलआर 4.5 है, अगली भाषा _is_ सी # 5 –

उत्तर

8

कोई भी Task का इंतजार किया जा सकता है, भले ही यह कहां से आया था।

मैं क्यों DoSomethingAsync सिर्फ DoSomethingCore कहता है, के बाद से DoSomethingAsync बस के रूप में आसानी से async हो सकता है और await इस्तेमाल कर सकते हैं यकीन नहीं है।

एक general rule भी है जिसे आपको पुस्तकालय विधियों में ConfigureAwait(false) का उपयोग करना चाहिए।

संपादित करें: आप await उपयोग करने के लिए की जरूरत नहीं है है, तो विधि async नहीं बनाते हैं। async कुछ ओवरहेड जोड़ देगा (Async प्रदर्शन वीडियो के स्टीफन टब के जेन के लिए चैनल 9 देखें)। यदि आप केवल Task (जैसे DoSomethingAsync) वापस कर सकते हैं, तो इसे इस तरह से करें।

+0

DoSomethingAsync कॉल करता है DoSomethingCore क्योंकि मेरे वास्तविक जीवन परिदृश्य में, मेरे पास दो समान सार्वजनिक विधियां हैं जो कोर विधि का उपयोग करके कार्यक्षमता साझा करती हैं। मैं कॉन्फ़िगरएवाइट विधि को देखूंगा, जैसा कि मैंने पहले नहीं देखा था। –

+0

मैंने बेहतर तरीके से व्याख्या करने के लिए एक DoSomethingElseAsync() विधि जोड़ा है जो मुझे उलझन में था। मेरा मानना ​​है कि आपने इसे पर्याप्त रूप से समझाया है और DoSomethingAsync() विधि लाइब्रेरी विधि के लिए जाने का तरीका है। –

+0

ठीक है। अद्यतन उत्तर देखें। –

0

नीचे सूत्रीकरण कार्यात्मक है, लेकिन संभावना अतिरिक्त भूमि के ऊपर (वजह से अतिरिक्त async के लिए एक उच्च माध्यमिक कॉलबैक होने के लिए/का इंतजार विधि।) का कारण होगा

public async Task<ApiResult> DoSomethingElseAsync() 
{ 
    return await this.DoSomethingCore(); 
} 

यह टास्क सीधे वापस जाने के लिए आसान है के रूप में आप कर सकते हैं हमेशा 'async' के रूप में लागू विधि के बिना उस कार्य को कहीं और इंतजार करें। Async/प्रतीक्षा 'उपज वापसी' का उपयोग करने की तरह बहुत है; यह 'उपज' को लागू करने के लिए कुछ कंपाइलर जादू करता है, लेकिन गणना स्वयं परवाह नहीं करती है कि आप इसे कैसे कार्यान्वित करते हैं। इसी तरह, एक 'प्रतीक्षा' कॉल परवाह नहीं है कि प्रतीक्षा करने योग्य काम कैसे करते हैं, जब तक यह प्रतीक्षा योग्य है।

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