2013-11-15 58 views
0

我的代碼如下所示:正確的方式來阻止ReadAsStreamAsync

_req = new HttpRequestMessage(HttpMethod.Get, _uri); 
_response = await _httpClient.SendAsync(_req, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false); 

var rawResponse = new byte[_maxContentLength]; 

using (var responseStream = await _response.Content.ReadAsStreamAsync().ConfigureAwait(false)) 
{ 
    int read; 
    int offset = 0; 

    do 
    { 
     read = await responseStream.ReadAsync(rawResponse, 0, rawResponse.Length).ConfigureAwait(false); 
     html += Encoding.UTF8.GetString(rawResponse, 0, read); 
     offset += read; 

     if (offset > _maxContentLength) 
     { 
      return Error("Too big"); 
     } 

    } while (read != 0); 
} 

,是「返回錯誤()」,足以自由流和插座獲得下一個網址?

//編輯: 對於一些網頁await responseStream.ReadAsync掛起並無法返回

+0

您還需要在響應中添加using()。這應該釋放所有的資源。 –

+0

_response被置於另一個地方,因爲它是一個整體變量 – ekapek

回答

0

嘗試創建一個CancellationTokenSource,並呼籲取消對,當你想停下來。我假設你在開始時無法讀取Content-Length標題,因爲響應是塊編碼的?

+0

Content-Length不是解決方案,因爲_response = await _httpClient.SendAsync(_req,HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);總是在處置時下載所有內容,我不知道有什麼方法可以在沒有下載的情況下關閉連接 – ekapek

+0

問題是'爲什麼您在開始下載之前檢查Content-Length的值?除此之外 - 如果你沒有在響應對象上調用HttpResponseMessage.Dispose,連接和流將不會被釋放,直到垃圾收集器運行。 –

+0

我正在檢查,但不是它存在的每個站點 – ekapek