2013-04-08 9 views
5

पर इंतजार है का उपयोग कर रहा कि समाप्ति बिंदु हो और यह एक कैश करने के लिए लिखने के लिए निम्नलिखित कोड का उपयोग कर रहा अपवाद फेंक नहीं:HttpClient जब GetAsync

public async Task UpdateCacheFromHttp(string Uri) 
{ 
    if (string.IsNullOrEmpty(Uri)) 
     return; 

    var httpClient = new HttpClient(); 
    var response = await httpClient.GetAsync(Uri); 

    if ((response != null) && (response.IsSuccessStatusCode)) 
    { 
     var responseStream = await response.Content.ReadAsStreamAsync(); 
     WriteToCache(responseStream); 
    } 
} 

कोड आईआईएस पर चल रहा है।

यदि एंडपॉइंट तक नहीं पहुंचा जा सकता है तो मैं GetAsync को अपवाद फेंकने की अपेक्षा करता हूं। एक कोशिश-पकड़ के साथ भी, यह कभी विफल नहीं लगता है। GetAsync कभी वापस नहीं आता है (मैंने HttpClient पर 5 सेकंड टाइमआउट का प्रयास किया, अभी भी वापस नहीं आया)।

यह एक अपवाद फेंक करता है:

public Task UpdateCacheFromHttp(string Uri) 
{ 
    var updateCacheTask = Task.Factory.StartNew(new Action(() => 
    { 
     if (string.IsNullOrEmpty(Uri)) 
      return; 

     var httpClient = new HttpClient(); 
     var response = httpClient.GetAsync(Uri).Result; 

     if (response.IsSuccessStatusCode) 
     { 
      var responseStream = response.Content.ReadAsStreamAsync().Result; 
      WriteToCache(responseStream); 
     } 
    })); 

    return updateCacheTask; 
} 

मैं उम्मीद "दूरस्थ सर्वर से कनेक्ट करने में असमर्थ"।

मुझे संदेह है कि आईआईएस में चल रहे कोड के साथ इसका कुछ संबंध है, लेकिन क्यों? नया कार्य शुरू करने की आवश्यकता के बिना अपवाद को उचित रूप से फेंकने के लिए मैं इसे कैसे प्राप्त करूं?

उत्तर

15

मेरा अंतर्ज्ञान मुझे बताता है कि आप Wait या Result को अपने कॉल स्टैक को आगे बढ़ा रहे हैं।

यदि यह सही है, तो आप I explain on my blog के रूप में एक डेडलॉक पैदा कर रहे हैं।

+1

यह काफी अंतर्ज्ञान है। धन्यवाद। – Askolein

+4

+1, आपका अंतर्ज्ञान एक शानदार बात है। – Valentin