2013-04-08 26 views
5

Tôi đang sử dụng đoạn mã sau để có được một thiết bị đầu cuối và ghi nó vào một bộ nhớ cache:HttpClient không ném ngoại lệ khi sử dụng đang chờ đợi trên 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); 
    } 
} 

Mã này được chạy trên IIS.

Nếu không thể tiếp cận điểm cuối tôi mong đợi GetAsync sẽ ném ngoại lệ. Ngay cả với một Try-Catch, nó không bao giờ có vẻ thất bại. GetAsync không bao giờ trả về (tôi đã thử thời gian chờ 5 giây trên HttpClient, vẫn không trả lại).

này không ném một ngoại lệ:

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

tôi nhận được mong đợi "Không thể kết nối đến máy chủ từ xa".

Tôi nghi ngờ nó có liên quan đến mã đang chạy trong IIS, nhưng tại sao? Làm thế nào để tôi có được nó để ném đúng ngoại lệ mà không cần phải bắt đầu một nhiệm vụ mới?

Trả lời

15

Trực giác của tôi cho tôi biết rằng bạn đang gọi số Wait hoặc Result thêm lên ngăn xếp cuộc gọi của mình.

Nếu đúng, thì bạn đang gây ra bế tắc, như I explain on my blog.

+1

Đó là một trực giác. Cảm ơn. – Askolein

+4

+1, Trực giác của bạn là một điều tuyệt vời. – Valentin

Các vấn đề liên quan