2013-04-08 36 views
5

使用的await當我用下面的代碼來獲得一個端點,並將其寫入高速緩存未拋出異常:的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); 
    } 
} 

的代碼運行在IIS上。

如果無法到達端點,我希望GetAsync引發異常。即使使用Try-Catch,它似乎永遠不會失敗。 GetAsync永遠不會返回(我嘗試了5秒的HttpClient超時,仍然沒有返回)。

這確實拋出一個異常:

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

我得到預期的「無法連接到遠程服務器」。

我懷疑它與在IIS中運行的代碼有關,但爲什麼?如何在不需要開始新任務的情況下正確拋出異常?

回答

15

我的直覺告訴我,你打電話給WaitResult進一步調用你的調用堆棧。

如果這是正確的,那麼你導致了一個死鎖,如I explain on my blog

+1

這很直觀。謝謝。 – Askolein 2013-08-22 10:45:22

+4

+1,你的直覺是一件很棒的事情。 – Valentin 2013-12-04 09:25:46

相關問題