c# asp.net web-services dispose

c# - ¿Debo disponer de una referencia de servicio web en ASP.NET?



web-services dispose (4)

¿El recolector de basura limpia las referencias del servicio web o debo llamar a desechar en la referencia del servicio después de que termine de llamar a cualquier método que llame?


Creo que DataService hereda Dispose from Component.


¿Qué estás tratando de lograr aquí?

Si le preocupa el rendimiento, me preocuparía más la capacidad de respuesta del servidor que aloja el servicio web y la velocidad de la red, ya que pueden afectar dramáticamente el tiempo que tiene que esperar para completar la llamada al servicio web (a menos que sea asincrónico).

Los ejemplos en MSDN no llaman ''Dispose'' y es bastante obvio que el recolector de basura hará su trabajo, así que a menos que trabaje en un sistema en tiempo real que necesita procesar más de 100,000 registros en memoria cada segundo, entonces tal vez no necesite subir con una forma de disponer de los recursos o administrar la memoria.


Los objetos que implementan IDispose se deben eliminar manualmente para ayudar al recolector de basura.

Si objeta es de corta vida use un bloque de using . Para los objetos que se pueden conservar, asegúrese de que el objeto que los retiene se deshaga de ellos cuando también se eliminan.


En lugar de preocuparse por deshacerse de sus servicios web, puede conservar solo una instancia única de cada servicio web, utilizando un patrón único . Los servicios web son apátridas, por lo que se pueden compartir de forma segura entre conexiones y subprocesos en un servidor web.

Aquí hay un ejemplo de una clase de servicio web que puede usar para mantener referencias a las instancias de su servicio web. Este singleton es flojo y seguro para subprocesos. Se recomienda que si haces que tus singletons sean flojos, también se mantengan seguros al hilo siguiendo la misma lógica. Para obtener más información acerca de cómo hacer esto, lea el artículo C # In Depth sobre Implementación de Singletons .

También tenga en cuenta que puede tener problemas con los servicios web de WCF. Recomiendo leer el artículo sobre técnicas de gestión de instancias de WCF , específicamente la sección singleton, para más detalles.

public static class WS { private static object sync = new object(); private static MyWebService _MyWebServiceInstance; public static MyWebService MyWebServiceInstance { get { lock (sync) { if (_MyWebServiceInstance == null) { _MyWebServiceInstance= new MyWebService(); } } return _MyWebServiceInstance; } } }

Y luego, cuando necesite acceder a su servicio web, puede hacer esto:

WS.MyWebServiceInstance.MyMethod(...)

o

var ws = WS.MyWebServiceInstance; ws.MyMethod(...)

He utilizado con éxito este patrón en varios proyectos y ha funcionado bien, pero como tvanfosson menciona en los comentarios a continuación, una estrategia aún mejor sería usar un marco DI para administrar sus instancias de servicios web.