2009-02-02 9 views
18

He algún código similar, este código se utiliza muy fuertemente:¿Debo llamar a Cerrar en HttpWebResponse, incluso si está dentro de una declaración de uso?

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

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

El código funciona bien hoy, pero las conexiones con el servidor de estancia abierta desde hace bastante tiempo. (comprobado mediante TCPView)

¿Existe alguna ventaja de llamar al método Close() explícitamente? ¿Se recomienda, o tal vez se recomienda no hacerlo, y por qué?

+0

supongo que esto responde a mi pregunta: http://stackoverflow.com/questions/45036/will-the-gc-call-idisposabledispose-for-me – BlackTigerX

+0

No. Si las llamadas Finalizer disponer o no es muy problema diferente –

Respuesta

0

Si tiene un código significativo dentro del uso después de haber terminado de consumir la respuesta, entonces el cierre seguro es correcto. Sin embargo, es posible que desee considerar la refacturación de su código para que el código que no necesita la respuesta no se encuentre dentro del bloque de uso.

Dicho esto, cerrar la respuesta no necesariamente cierra la conexión. El protocolo HTTP/1.1 prevé que la conexión permanezca abierta para que las solicitudes posteriores sean más rápidas.

+1

FWIW, La primera oración de esta respuesta debe leerse detenidamente. Sería más claro comenzar explicando, como lo hacen otras respuestas, que 'usar' te 'cierra' - no necesitas llamarlo tú mismo.Una vez que tienes claro eso, entonces puedes entender lo que dice la frase: si por alguna razón quieres 'cerrar' (para liberar recursos) a mitad del bloque' using', entonces sigue adelante y hazlo, pero un diseño más limpio sería * solo mantener dentro del bloque de uso, código que usa el resultado *. – ToolmakerSteve

26

Cuando Dispose() se llama en WebResponse (clase base HttpWebReponse 's), que llama es Close() método para usted. Un vistazo rápido usando Reflector lo confirma.

Editar (en respuesta al comentario): Si ya se lo llamaron, ¿por qué lo llama explícitamente? ¿Por el bien de la claridad? Creo que si las personas entienden la declaración using (X x = ...), entenderán que está cerrando la conexión subyacente. No gana nada al llamarlo explícitamente en este caso.

+0

Sé que sí, la pregunta es si debería llamar. Cerrar de todos modos – BlackTigerX

+0

tienes razón, "usar" llama al Dispose, GC llama a Finalize – BlackTigerX

+0

Cool, me alegra oírlo. Lo siento, no fue la respuesta correcta para ti. –

1

Creo que Close es el método que implementa IDisposable.Dispose, por lo tanto, definitivamente no hay necesidad de llamar al método Close de antemano. Es completamente redundante.

+0

Un método llamado "Cerrar" no puede implementar un miembro de interfaz llamado "Eliminar". Uno puede llamar al otro, pero son métodos distintos. – harpo

+0

No es del todo cierto. En VB.NET, esto es realmente posible. Solo en C# es (técnicamente) no, aunque uno puede imitarlo muy fácilmente. – Noldorin

+0

Soy corregido. http://stackoverflow.com/questions/5533659/in-c-is-it-possible-to-implement-un-interface-member-using-a-member-with-a-dif – harpo

15

El using palabra clave es un azúcar sintáctica para try/finally bloque, que se envuelve alrededor de su HttpWebResponse, ya que implementa IDisposable. Cuando se encuentre en la cláusula finally, llamará al método Dispose(), que llamará al Close(). Esto significa que no tiene que llamar explícitamente al método Close().

Cuestiones relacionadas