2013-09-03 12 views
5

इसमें कुछ समय घना है, लेकिन यहाँ जाता है ....कार्य पर प्रतीक्षा कैसे करता है। परिणाम नेस्टेड एसिंक/प्रतीक्षा विधियों को प्रभावित करता है?

को देखते हुए मैं बहुत की तरह एक अंतरफलक है कि:

public interface IWebClientHelper 
{ 
    TPayload Get<TPayload>(string url); 
} 

कहाँ Get के कार्यान्वयन की आपूर्ति यूआरएल, को फोन करेगा जो TPayload प्रकार के जेसन ऑब्जेक्ट वाली प्रतिक्रिया वापस कर देगा), और जेसन TPayload में deserialized है और फिर लौटा दिया।

मैं Get विधि अतुल्यकालिक के कार्यान्वयन बनाने के (या अधिक विशेष HTTP Get विधि अतुल्यकालिक के भीतर निहित फोन करना) करना चाहते हैं, लेकिन जैसा कि मैंने यह समझते हैं, कि आवश्यकता होगी कि Get विधि के हस्ताक्षर बदला जा करने के लिए:

Task<TPayload> Get<TPayload>(string url); 

मैं इंटरफ़ेस रखने के लिए के रूप में यह है लक्ष्य कर रहा हूँ, तो मैं एक दूसरे अंतरफलक बनाया:

public interface IAsyncWebClientHelper 
{ 
    Task<TPayload> Get<TPayload>(string url); 
} 

और इंजेक्शन है कि मेरे कार्यान्वयन में IWebClientHelper की प्रविष्टि।

public TPayload Get<TPayload>(string url) 
{ 
    return _asyncWebClientHelper.Get<TPayload>(url).Result; 
} 

और _asyncWebClientHelper की Get विधि लाइन

message = await httpClient.GetAsync(url); 

तो इसमें इस बात पर मैं पर स्पष्ट नहीं कर रहा हूँ यह है:: तो अब IWebClientHelper की मेरी कार्यान्वयन इस तरह दिखता है मैं सोच रहा लाइन है कि में सही हूँ return _asyncWebClientHelper.Get<TPayload>(url).Result तब तक निष्पादन को अवरुद्ध कर देगा जब तक कि विधि वापस न आए? या उस विधि के अंदर await कीवर्ड तब तक थ्रेड जारी करेगा जब तक कि उसे यूआरएल से प्रतिक्रिया प्राप्त न हो जाए?

+2

यह सिंक-ओवर-एसिंक है जो एक विरोधी पैटर्न है। – usr

उत्तर

19

हां, Result का उपयोग करना मतलब है कि आपकी विधि अवरुद्ध होगी। हालांकि, यह काफी संभव है कि इसका मतलब है कि यह वास्तव में एक डेडलॉक का कारण बन जाएगा। आपने संदर्भ के बारे में हमें बहुत कुछ नहीं बताया है, लेकिन यदि आप एक संदर्भ में हैं, जहां await के बाद आपको उसी धागे पर वापस लौटना होगा, लेकिन Result के कारण वह धागा अवरुद्ध हो गया है, तो आप मूल रूप से अपने आप पर डेडलॉक कर रहे हैं । आपको बहुत सावधान रहना होगा जहां आप Result संपत्ति या Wait() विधि जैसी किसी भी अवरुद्ध कॉल का उपयोग करते हैं।

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

+0

मैंने सोचा कि यह मामला हो सकता है, सिंक्रोनस इंटरफ़ेस में सभी 64 संदर्भों को बदलने के बारे में सेट करने से पहले बस यह सुनिश्चित करना चाहता था ... –

+1

@ paynecrl97: आपको मेरी सहानुभूति है। कोड को एसिंक से सिंक में कनवर्ट करना कभी मजेदार नहीं होता है। –

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

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