2015-04-15 129 views
0

我在c#中創建HTTP WebRequests來導航網站。我創建請求,獲取響應並將其讀入StreamReader。然後我使用相同的請求變量來創建一個新的請求,並得到一個新的響應...關閉HttpWebRequest來釋放資源

下面是我的代碼:

HttpWebRequest request; 
WebResponse response; 
Stream responseStream; 
StreamReader reader; 
string responseFromServer; 

request = (HttpWebRequest)WebRequest.Create("https://www.firstRequest.com"); 

//set cookies and headers here... 

response = request.GetResponse(); 

responseStream = response.GetResponseStream(); 
reader = new StreamReader(responseStream); 
responseFromServer = reader.ReadToEnd(); 


//second request using the same variables 
request = (HttpWebRequest)WebRequest.Create("https://www.secondRequest.com"); 
response = request.GetResponse(); 

responseStream = response.GetResponseStream(); 
reader = new StreamReader(responseStream); 
responseFromServer = reader.ReadToEnd(); 

我知道我必須關閉的響應,流,StreamReader的自由提供資源。 我是否必須在每次請求之間或在每件事情結束時都這樣做?

回答

1

Alltough @spender有一點,他說你應該使用using指令,我不認爲他的答案回答你的問題或特別有用。

在考慮這樣的問題時,請考慮一下C#和實現IDisposable的對象的基本原理。這樣做的類使用非託管資源,當不再使用該類時需要釋放這些資源。這種情況發生在using塊的末尾或調用Dispose時。

然而,在致電Dispose之後,不應該再使用該對象。這是與Close的根本區別。使用Close響應釋放資源,同一個對象可以被其他請求重用。 MSDN for Close

現在讓我們考慮一下如果您只是覆蓋響應變量會發生什麼。類是C#中的引用類型,變量現在將引用新對象,並且舊響應對象將在涅van中消失,等待最終由GC收集而不調用Dispose。當然不是你想要的。

所以,如果你想重用的變量,請確保您使用Close

+0

以及哪些我必須關閉?反應,流媒體和閱讀器?不是要求 - 對嗎?關閉相同的資源兩次會傷害嗎?我在一個循環中調用close,然後當它打破循環時,我想再次調用close以獲得積極的結果。這可以嗎? – Diane2

+0

該請求沒有實現'IDisposable',所以沒有什麼可以關閉的。其他一切都應該正確關閉。當然,如果每次使用'Close',則可以在循環中重用該變量。取決於循環運行的頻率,您可能需要考慮更高效的替代方案。只要確保在變量被覆蓋或不再使用之前調用Close。這通常可以通過良好的環路設計輕鬆實現。 – Xaser

+0

謝謝大家!我想我會採用這種方法。 – Diane2

1

是的,你需要自己清理一次。只是利用了IDisposable的功能,你忽略:

所以,相反,你可以

using(response = request.GetResponse()) 
{ 
    using(responseStream = response.GetResponseStream()) 
    { 
     using(reader = new StreamReader(responseStream)) 
     { 
      responseFromServer = reader.ReadToEnd(); 
     } 
    } 
} 

或更簡潔:

using(response = request.GetResponse()) 
using(responseStream = response.GetResponseStream()) 
using(reader = new StreamReader(responseStream)) 
{ 
    responseFromServer = reader.ReadToEnd(); 
} 

...現在你不需要擔心打電話Close。 IDisposable實現將爲您處理它(當using塊結束時)。

+0

所以後來我在哪裏了,需要你使用語句間進去的代碼? – Diane2

+0

@ Diane2我不明白你的問題。你能改說嗎? – spender

+0

當然。你說使用,使用,然後使用你的代碼塊。我可以在代碼塊中引用響應嗎?還是已經關閉了?我不瞭解你編寫代碼的方式。謝謝 – Diane2