2014-02-26 57 views
0

關閉流的用戶觀點有什麼好處?關閉流的好處

運行此代碼時,無論您是否註釋掉response.Close();,它都不會對用戶造成明顯區別。

任何人都可以給我一個例子,不關閉流/文件句柄等會給用戶造成明顯的問題嗎?

WebRequest request = WebRequest.Create("http://www.microsoft.com"); 
    WebResponse response = request.GetResponse(); 
    StreamReader responseStream = new StreamReader(response.GetResponseStream()); 
    string responseText = responseStream.ReadToEnd(); 
    Console.WriteLine(responseText); // Displays the HTML of the website 
    response.Close(); 

編輯: 每個人都在說的東西,如「這是很好的處置/關閉流,所以你釋放非託管資源」。但任何人都可以給我提供一個例子,說明這可以如何爲最終用戶創造顯着的差異?

+1

假設您的系統中有數據庫連接。假設許多用戶正在使用此係統創建大量連接。如果您沒有關閉連接(這是非託管資源),您可能會遇到連接過多並且新連接會被拒絕的情況 – TJF

+0

給定答案中是否缺少任何內容?如果是這樣,你錯過了什麼? – Max

+0

我沒有機會閱讀答案,當我這樣做時我會選擇一個作爲最佳答案。 –

回答

4

使用它們關閉/處置所有流是非常重要的。要做到這一點
最佳方式是通過使用一個using statement

using(StreamReader responseStream = new StreamReader(response.GetResponseStream()) 
{ 
    //streamreader will be disposed automatically, 
    //when done executing within brackets. 
} 

如果流(一個或多個)不/未正確關閉/處置時,會引起了內存泄漏。 流使用的資源將在關閉/處理流時釋放。

大家都在說這樣的話:「放置/關閉流很好,所以你釋放非託管資源。」 。但任何人都可以給我提供一個 的例子,顯示這可以如何創建一個明顯的差異到最終 用戶?

嘗試在你的應用程序下面的代碼:

private void LoopUndisposedStream() 
{ 
    for(int i = 0; i < 5000000; i++) 
    { 
     CreateUndisposedStream(); 
    } 
} 

private void CreateUndisposedStream() 
{ 
    WebRequest request = WebRequest.Create("http://www.microsoft.com"); 
    WebResponse response = request.GetResponse(); 
    StreamReader responseStream = new StreamReader(response.GetResponseStream()); 
    string responseText = responseStream.ReadToEnd(); 
    Console.WriteLine(responseText); // Displays the HTML of the website 
} 

上面的代碼是什麼,你應該絕對不會做的。但是,既然你要求一個例子,顯示性能問題,而不是處理每個流。這裏是。

+0

終結者呢? (這不是沒有理由不'處置()') –

+0

@ C.Evenhuis對不起,我不明白你的問題。爲什麼我們不應該處理所有的一次性物品? – Max

+0

內存泄漏有什麼不好? –

1

通過關閉你釋放資源Stream,此外你做出一些對象,你不再需要符合GargabeCollector所以它減少了內存佔用等

4

通過關閉你放開束縛了它的資源流,儘管這些資源可能會根據您使用的流類型而有所不同,其中一些資源會對其他資源產生較大影響。

FileStream爲例。當流打開時,它在文件上有一個打開的句柄。如果你不關閉它,句柄將不會被釋放,直到對象在將來某個未指定的點被垃圾收集爲止。

現在,這取決於你如何打開該文件時可能會遇到的問題,舉個例子如下:

FileStream file = new FileStream("example.dat",FileMode.Open,FileAccess.Read,FileShare.None); 

這得到上不會被釋放的文件的獨佔鎖定。這意味着任何其他打開文件和讀取的調用都會失敗。

所以它總是更好,尤其是在處理與非託管資源接口的類時,一旦完成就會發布。

一個這樣做是使用using結構最簡單的方法,例如:

using (FileStream file = new FileStream("example.dat",FileMode.Open,FileAccess.Read,FileShare.None)) { 
    // Do something useful 
} 

您可以使用using與實現IDisposable,這將確保一旦的範圍之外的任何類聲明Dispose被調用並釋放任何資源。