2013-04-08 14 views
5

używam następujący kod, aby uzyskać końcowy i zapisać go do pamięci podręcznej:HttpClient nie rzuca wyjątek podczas korzystania czekają na 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); 
    } 
} 

Kod jest uruchomiony na IIS.

Jeśli punkt końcowy jest nieosiągalny, oczekiwałbym, że funkcja GetAsync wyrzuci wyjątek. Nawet przy próbie złapania, nigdy nie kończy się niepowodzeniem. GetAsync nigdy nie wraca (próbowałem 5-sekundowego limitu czasu na HttpClient, wciąż nie wróciłem).

to robi wyjątek:

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; 
} 

uzyskać oczekiwany "Nie można połączyć się ze zdalnym serwerem".

Podejrzeń, że ma to coś wspólnego z kodem uruchomionym w IIS, ale dlaczego? Jak mogę go poprawnie wyrzucić wyjątek bez konieczności uruchamiania nowego zadania?

Odpowiedz

15

Moja intuicja podpowiada, że ​​dzwonisz pod numer Wait lub .

Jeśli jest to prawidłowe, powoduje to zakleszczenie, ponieważ jest to I explain on my blog.

+1

To dość intuicja. Dzięki. – Askolein

+4

+1, Twoja intuicja jest genialna. – Valentin

Powiązane problemy