2009-02-02 65 views
18

我有一些這樣的代碼,該代碼是用來非常嚴重:即使它在使用語句中,我是否應該在HttpWebResponse上調用Close?

using (HttpWebResponse r = _GetHttpWebResponse(uri, body, method, contentType, headers)) { 
    /* do something with the response */ 

    /* call r.Close() explicitly? */ 
} 

代碼今天精細的工作,但到服務器逗留的連接開放相當長的一段時間。 (使用TCPView進行檢查)

明確調用Close()方法有沒有好處?是建議,還是建議不要這樣做,爲什麼?

+0

我想這回答我的問題: http://stackoverflow.com/questions/45036/will-the-gc-call-idisposabledispose-for-me – BlackTigerX 2009-02-02 22:55:32

+0

號是否終結調用Dispose與否是一個非常不同的問題。 – 2009-02-03 00:37:24

回答

0

如果在完成使用完響應之後,您在使用中有重要的代碼,那麼確定調用close是可以的。但是,您可能需要考慮重構代碼,以便不需要響應的代碼不在使用塊內。

這就是說關閉響應並不一定會關閉連接。 HTTP/1.1協議規定連接保持打開狀態,以便後續請求更快。

26

Dispose()被調用WebResponseHttpWebReponse的基類)時,它會爲您調用它的Close()方法。用Reflector快速瀏覽確認了這一點。

編輯(回覆評論):如果它已經被調用,爲什麼要明確地調用它?爲清楚起見?我認爲如果人們瞭解using (X x = ...)聲明,他們會明白它正在關閉底層連接。在這種情況下,你明確地調用它什麼都沒有得到。

+0

我知道它確實,問題是如果我應該打電話。反正關閉 – BlackTigerX 2009-02-02 22:33:14

+0

你是對的,「使用」調用Dispose,GC調用Finalize – BlackTigerX 2009-02-02 22:56:51

1

我相信Close是實現IDisposable.Dispose的方法,因此肯定不需要事先調用Close方法。它完全是多餘的。

15

using關鍵字是try/finally區塊的語法糖,該區塊圍繞您的HttpWebResponse環繞,因爲它實現了IDisposable。在finally子句中,它將調用Dispose()方法,該方法將調用Close()。 這意味着您不必明確調用Close()方法。

相關問題