2009-02-02 28 views
18

Tôi có một số mã như thế, mã này được sử dụng rất nặng nề:Tôi có nên gọi Close trên HttpWebResponse, ngay cả khi nó nằm trong một câu lệnh sử dụng?

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

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

Mã này hoạt động tốt ngày hôm nay, nhưng các kết nối đến máy chủ nghỉ mở trong một thời gian khá. (được kiểm tra bằng TCPView)

Có lợi ích gì khi gọi phương thức Close() một cách rõ ràng không? Được khuyến nghị, hoặc có thể được khuyên không nên làm, và tại sao?

+0

Tôi đoán điều này sẽ trả lời câu hỏi của tôi: http://stackoverflow.com/questions/45036/will-the-gc-call-idisposabledispose-for-me – BlackTigerX

+0

No. Cho dù finalizer gọi dispose hay không là rất vấn đề khác. –

Trả lời

0

Nếu bạn có mã quan trọng bên trong việc sử dụng sau khi bạn đã hoàn thành việc tiêu thụ phản hồi thì chắc chắn việc gọi đóng là ok. Tuy nhiên, bạn có thể muốn xem xét sắp xếp lại mã của mình để mã không cần phản hồi không nằm trong khối sử dụng.

Điều đó nói rằng việc đóng phản hồi không nhất thiết phải đóng kết nối. Giao thức HTTP/1.1 tạo điều kiện cho kết nối vẫn mở để thực hiện các yêu cầu tiếp theo nhanh hơn.

+1

FWIW, Câu đầu tiên của câu trả lời này cần được đọc kỹ. Nó sẽ là rõ ràng hơn để bắt đầu bằng cách giải thích, như câu trả lời khác làm, mà 'using' hiện' close' cho bạn - bạn không cần phải gọi nó là chính mình.Một khi bạn đã rõ ràng về điều đó, thì bạn có thể hiểu câu nói đang nói gì: nếu vì lý do nào đó bạn muốn 'đóng' (để giải phóng tài nguyên) giữa đường thông qua khối' using', hãy tiếp tục và làm như vậy - nhưng một thiết kế sạch sẽ là * chỉ giữ bên trong khối sử dụng, mã sử dụng kết quả *. – ToolmakerSteve

26

Khi Dispose() được gọi trên lớp cơ sở WebResponse (HttpWebReponse), nó gọi phương thức là Close() cho bạn. Một cái nhìn nhanh chóng bằng cách sử dụng Reflector xác nhận điều này.

Chỉnh sửa (để trả lời nhận xét): Nếu nó được gọi cho bạn, tại sao lại gọi nó là rõ ràng? Vì lợi ích của sự rõ ràng? Tôi nghĩ nếu mọi người hiểu được tuyên bố using (X x = ...), họ sẽ hiểu rằng nó đang đóng kết nối cơ bản. Bạn không đạt được gì bằng cách gọi nó rõ ràng trong trường hợp này.

+0

Tôi biết nó, câu hỏi là nếu tôi nên gọi. Đóng anyway – BlackTigerX

+0

bạn nói đúng, "sử dụng" gọi Dispose, GC gọi Finalize – BlackTigerX

+0

Thật tuyệt, rất vui khi nghe nó. Xin lỗi nó không phải là câu trả lời đúng cho ya. –

1

Tôi tin rằng Close là phương pháp triển khai IDisposable.Dispose, do đó chắc chắn không cần phải gọi phương thức Close trước. Nó hoàn toàn dư thừa.

+0

Một phương pháp được gọi là "Đóng" không thể thực hiện một thành viên giao diện được gọi là "Vứt bỏ". Người ta có thể gọi người kia, nhưng họ là những phương pháp khác biệt. – harpo

+0

Không hoàn toàn đúng. Trong VB.NET, điều này thực sự là có thể. Nó chỉ trong C# mà nó là (về mặt kỹ thuật) không, mặc dù người ta có thể bắt chước nó rất dễ dàng. – Noldorin

+0

Tôi đã sửa. http://stackoverflow.com/questions/5533659/in-c-is-it-possible-to-implement-an-interface-member-using-a-member-with-a-dif – harpo

15

Từ khóa using là một đường cú pháp cho khối try/finally, bao quanh xung quanh HttpWebResponse của bạn, vì nó triển khai IDisposable. Khi trong mệnh đề finally, nó sẽ gọi phương thức Dispose(), gọi là Close(). Điều này có nghĩa là bạn không phải gọi phương thức Close() một cách rõ ràng.

Các vấn đề liên quan