2009-10-08 107 views
2

我收到HttpWebRequest(使用修改後的版本Jeff Richter's CCR wrappers)的響應,然後檢查一些標題以決定是否繼續下載。有時我可能不想繼續,因此我發佈response.Closerequest.Abort。是否有必要發佈GetResponseStream然後關閉流,或者這是隱含的,當你調用response.CloseHttpWebResponse:關閉流

發出的GetResponse的docs state後:

必須調用Close方法關閉該流並釋放連接。否則可能會導致應用程序無法連接。

因此,這是否意味着一旦我們有迴應,那麼它是必須獲得流並關閉它?

我們看到一些相當奇怪的問題,其中下載最終會淹沒系統。這似乎是資源泄漏的最強候選人,但不知道是否有其他人對此問題有經驗。

另外:假設它是同一個流,GetResponseStream是否安全兩次?

回答

2

實際上,調用webResponse.Close()將關閉響應流。

答案是IDisposable,我建議你一個使用語句。

+0

我錯過了它是IDisposable。關於爲什麼Dispose方法是私人的任何線索?這是正常的嗎?使用聲明看起來像是一個很好的增強。 +1 – spender 2009-10-08 11:23:05

+1

[使用Dispose方法讓智能自我不要檢查「IDisposability」] – spender 2009-10-08 11:25:38

+0

@spender它已作爲[顯式接口實現]實現(http://msdn.microsoft.com/zh-cn/我們/庫/ vstudio/ms173157.aspx)。我相信在框架的早期模式是隱藏'Dispose'在一個明確的實現後面並且定義一個執行相同動作的公共'Close'方法。 – 2013-08-07 20:58:37

6

調用HttpWebResponse.Close隱含關閉響應流。

從文檔:

Close方法關閉響應流並釋放其他請求

連接到資源再利用,必須調用要麼Stream.Close或HttpWebResponse.Close方法來關閉流並釋放連接以供重用。不必調用Stream.Close和HttpWebResponse.Close,但這樣做不會導致錯誤。未能關閉流可能導致應用程序無法連接。

併爲您的雙的GetResponseStream問題,雖然​​沒有明確提到它,它總是會返回相同的流對象,無論你有多少次調用它。

+0

要確認:我應該這樣做,即使我從來沒有在第一時間流? – spender 2009-10-08 10:19:47

+0

是的。我已添加更新。 – 2009-10-08 10:22:13

0

這樣做WCF Connections

//Done with the service, let's close it. 
try 
{ 
    if (client.State != System.ServiceModel.CommunicationState.Faulted) 
    { 
     client.Close(); 
    } 
} 
catch (Exception ex) 
{ 
    client.Abort(); 
}