Vida de objetos

05/03/2004 - 21:08 por Luis Ruiz | Informe spam
Hola, tengo una aplicación distribuida en la que la
comunicación entre la capa de negocio y la de
presentación es realizada por un objeto de la clase de
reglas del negocio, el problema es que al parecer,
transcurrido cierto tiempo el recolector se me lo lleva y
me quedo sin mi objeto en memoria.
Lo que deseo que me expliquen es cómo alargar, la vida de
mis objetos en memoria o cómo puedo manupular
directamente su desctrucción a fin de evitar estos
pronblemas
Gracias

Preguntas similare

Leer las respuestas

#1 Juan Cristóbal Olivares C.
06/03/2004 - 17:33 | Informe spam
Es raro que el recolector se lo "lleve" si es que aún existe una referencia
al objeto en alguna parte. Si lo deseas, puedes suprimir la opearción del
garbage collector sobre el objeto. Mira la documentación del método
GC.SuppressFinalize

Atte,
Juan C. Olivares
www.juancri.com


"Luis Ruiz" wrote in message
news:7ccf01c402ed$a2ba4e80$
Hola, tengo una aplicación distribuida en la que la
comunicación entre la capa de negocio y la de
presentación es realizada por un objeto de la clase de
reglas del negocio, el problema es que al parecer,
transcurrido cierto tiempo el recolector se me lo lleva y
me quedo sin mi objeto en memoria.
Lo que deseo que me expliquen es cómo alargar, la vida de
mis objetos en memoria o cómo puedo manupular
directamente su desctrucción a fin de evitar estos
pronblemas
Gracias
Respuesta Responder a este mensaje
#2 Luis Ruiz
06/03/2004 - 19:38 | Informe spam
Si tene razón es raro, probablemente tiene que ver con
algo más.
El objeto es creado por medio de un activador de una
interfaz remoting tipo singleton. Mejor describo más
para ver si me pueden ayudar:

Tengo una aplicacion distribuida en capas (presentacion,
reglas del negocio, acceso a datos) en la que la capa de
presentacion se comunica con la de reglas del negocio por
medio de remoting, para lo cual utilizo una interfaz de
una clase de reglas del negocioubicada en otro dll que
llamo fachada del negocio.
La capa de presentacion tiene referencia fachadadelnegocio
(interfaz) y no a reglas del negocio.
Desce la capa de presentacion creo una instancia de la
clase gestor de la siguiente manera:

public static
DataPowerSoft.FachadaNegocio.Interfaces.IGestor CreaGestor
()
{
DataPowerSoft.FachadaNegocio.Interfaces.IGestor objGestor
= (DataPowerSoft.FachadaNegocio.Interfaces.IGestor)
Activator.GetObject(Type.GetType
("DataPowerSoft.FachadaNegocio.Interfaces.IGestor,FachadaN
egocio"),"tcp://localhost:8085/Gestor");

objGestor.MotorBaseDatos = Conexion.MotorBaseDatos;
objGestor.Servidor = Conexion.Servidor;
objGestor.BaseDatos = Conexion.BaseDatos;
objGestor.Login = Conexion.Login;
objGestor.Password = Conexion.Password;

return objGestor;
}

El servidor remoting(proyectio de consola) tiene el
siguiente código:

[STAThread]
static void Main(string[] args)
{
TcpChannel CanalTcp = new TcpChannel(8085);
HttpChannel CanalHttp = new HttpChannel(8086);

ChannelServices.RegisterChannel(CanalTcp);
ChannelServices.RegisterChannel(CanalHttp);

DataPowerSoft.ReglasNegocio.Clases.Gestor objGestor =
new
DataPowerSoft.ReglasNegocio.Clases.Gestor();

RemotingConfiguration.RegisterWellKnownServiceType
(objGestor.GetType
(),"Gestor",WellKnownObjectMode.Singleton);

Console.WriteLine("Servidor remoting activo!");
Console.WriteLine("Pulse Enter para cerrar el
servidor...");
Console.ReadLine();

ChannelServices.UnregisterChannel(CanalTcp);
ChannelServices.UnregisterChannel(CanalHttp);

}

Cualquier sugerencia es agradecida.
Respuesta Responder a este mensaje
#3 Angel \Java\ Lopez
07/03/2004 - 16:11 | Informe spam
Hola Luis Ruiz!

Deberias investigar el sistema de "Lease" que tiene Remoting. No uso
Singleton a tu manera, pero si el objeto "se fue", es que no ha habido
alguien que lo consuma por un tiempo. Remoting tiene para eso un tiempo
asignado a cada objeto, una especie de "timeout", pasado el cual, le suelta
la mano.

Si el problema es ese, se puede encarar:

- Indicandole a Remoting que el objeto no muera
- Creandole un "sponsor" que renueve su tiempo de "lease".

Estudia de la documentacion:

la interface ILease
el namespace System.Runtime.Remoting.Lifetime
articulos como el Initializing Leases

Que recuerde, poner en un MarshalByRefObject que su metodo
InitializeLifetimeService devuelva null, hace que no tenga tiempo de
expiracion.

public class MyLifetimeControlObject: MarshalByRefObject {
public override Object InitializeLifetimeService()
{
return null;
}
}

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/


"Luis Ruiz" wrote in message
news:81a001c403aa$379ce7d0$
Si tene razón es raro, probablemente tiene que ver con
algo más.
El objeto es creado por medio de un activador de una
interfaz remoting tipo singleton. Mejor describo más
para ver si me pueden ayudar:

Tengo una aplicacion distribuida en capas (presentacion,
reglas del negocio, acceso a datos) en la que la capa de
presentacion se comunica con la de reglas del negocio por
medio de remoting, para lo cual utilizo una interfaz de
una clase de reglas del negocioubicada en otro dll que
llamo fachada del negocio.
La capa de presentacion tiene referencia fachadadelnegocio
(interfaz) y no a reglas del negocio.
Desce la capa de presentacion creo una instancia de la
clase gestor de la siguiente manera:

public static
DataPowerSoft.FachadaNegocio.Interfaces.IGestor CreaGestor
()
{
DataPowerSoft.FachadaNegocio.Interfaces.IGestor objGestor
= (DataPowerSoft.FachadaNegocio.Interfaces.IGestor)
Activator.GetObject(Type.GetType
("DataPowerSoft.FachadaNegocio.Interfaces.IGestor,FachadaN
egocio"),"tcp://localhost:8085/Gestor");

objGestor.MotorBaseDatos = Conexion.MotorBaseDatos;
objGestor.Servidor = Conexion.Servidor;
objGestor.BaseDatos = Conexion.BaseDatos;
objGestor.Login = Conexion.Login;
objGestor.Password = Conexion.Password;

return objGestor;
}

El servidor remoting(proyectio de consola) tiene el
siguiente código:

[STAThread]
static void Main(string[] args)
{
TcpChannel CanalTcp = new TcpChannel(8085);
HttpChannel CanalHttp = new HttpChannel(8086);

ChannelServices.RegisterChannel(CanalTcp);
ChannelServices.RegisterChannel(CanalHttp);

DataPowerSoft.ReglasNegocio.Clases.Gestor objGestor new
DataPowerSoft.ReglasNegocio.Clases.Gestor();

RemotingConfiguration.RegisterWellKnownServiceType
(objGestor.GetType
(),"Gestor",WellKnownObjectMode.Singleton);

Console.WriteLine("Servidor remoting activo!");
Console.WriteLine("Pulse Enter para cerrar el
servidor...");
Console.ReadLine();

ChannelServices.UnregisterChannel(CanalTcp);
ChannelServices.UnregisterChannel(CanalHttp);

}

Cualquier sugerencia es agradecida.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida