2012-03-27 15 views
68

लौटाता है मेरे पास एक कॉल है जो मैं एक xaml- आधारित, C# मेट्रो एप्लिकेशन Win8 CP पर बना रहा हूं; यह कॉल बस एक वेब सेवा हिट करता है और जेएसओएन डेटा देता है।HttpClient में प्रतीक्षा के साथ Async कॉल कभी भी

HttpMessageHandler handler = new HttpClientHandler(); 

HttpClient httpClient = new HttpClient(handler); 
httpClient.BaseAddress = new Uri("http://192.168.1.101/api/"); 

var result = await httpClient.GetStreamAsync("weeklyplan"); 
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(WeeklyPlanData[])); 
return (WeeklyPlanData[])ser.ReadObject(result); 

यह await पर लटका हुआ है लेकिन http कॉल वास्तव में रिटर्न लगभग तुरंत (Fiddler के माध्यम से इस बात की पुष्टि); ऐसा लगता है कि await को अनदेखा किया गया है और यह बस वहां लटकता है।

इससे पहले कि आप से पूछें - हाँ - निजी नेटवर्क क्षमता चालू है।

कोई भी विचार क्यों लटकाएगा?

+1

आप 'async' विधि को कैसे कॉल कर रहे हैं? क्या यह अपवाद नहीं फेंकता है? – svick

उत्तर

97

मेरे प्रश्न पर this answer देखें जो बहुत समान लगता है।

कुछ कोशिश करने के लिए: ConfigureAwait(false) पर कॉल GetStreamAsync() द्वारा लौटाए गए कार्य पर कॉल करें। जैसे

var result = await httpClient.GetStreamAsync("weeklyplan") 
          .ConfigureAwait(continueOnCapturedContext:false); 

किया जाए या नहीं इस उपयोगी है कि कैसे अपने कोड ऊपर बुलाया जा रहा है पर निर्भर करता है - मेरे मामले Task.GetAwaiter().GetResult() वजह से कोड लटका का उपयोग कर async विधि बुला में।

ऐसा इसलिए है क्योंकि GetResult() कार्य पूरा होने तक वर्तमान धागे को अवरुद्ध करता है। जब कार्य पूरा हो जाता है तो यह थ्रेड संदर्भ को पुनः दर्ज करने का प्रयास करता है जिसमें इसे प्रारंभ किया गया था, लेकिन ऐसा नहीं हो सकता क्योंकि उस संदर्भ में पहले से ही एक धागा है, जिसे GetResult() पर कॉल द्वारा अवरुद्ध किया गया है ... डेडलॉक!

This MSDN post इस बारे में थोड़ी सी जानकारी में जाता है कि .NET समानांतर धागे को सिंक्रनाइज़ करता है - और the answer given to my own question कुछ सर्वोत्तम प्रथाओं को देता है।

+7

धन्यवाद, इसे देखने से पहले लगभग एसिंक/प्रतीक्षा छोड़ दिया। – Den

+4

मुझे भी! यह सामान बेहतर दस्तावेज क्यों नहीं है? धन्यवाद फिर से –

+1

क्या यह तब होगा जब यह न तो यूआई संदर्भ और एएसपी.नेट संदर्भ पर हो? – machinarium

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