Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Eventos Y Destruccion De Objetos En C-sharp

Iniciado por zupervaca, 09 de Julio de 2005, 01:26:22 PM

« anterior - próximo »

zupervaca

 hola me gustaria saber que ocurre en c-sharp cuando sucede este caso, tenemos dos objetos A y B, A permite agregar eventos, entonces B agrega un evento en A, entonces llega un momento que destruimos el objeto B, ¿que sucede con el evento que agregamos desde B a A? ¿se destruye tambien o queda en la lista de eventos y se sigue llamando?

saludos

NeLo

 Si el manejador de eventos no es miembro de B, continuarán ejecutándose. No veo problema.

De todas formas, se puede probar rápidamente.
Drowning deep in my sea of loathing

Haddd

 Existe un grave problema con los callbacks. Resulta que el GC no sabe cuando matarlos. Lei mucho de eso cuando tuve que hacer el Wrapper de Newton. Te decía que el problema es que si haces un new dentro de un método, y ese callback...ya se llamará cuando sea el caso...pues el GC se cree que lo puede matar enseguida.

Entonces había que hacer algo así como GC.KeepAlive al final

Pero lo cierto es que ya no me acuerdo muy bien. Y ahora mismo no lo hago para todos los objetos. Quizás en .net 2.0 lo han resuelto...

zupervaca

 el problema radica en que se llama a una funcion de B desde el manejador de eventos de A, lo he probado y en algunos casos lo hace perfectamente y en otros lo tienes que eliminar tu a mano, aun no se diferenciar bien el caso, pero en cuestion de reseteo del device es peligroso ya que puedes estar agregando resets del mismo objeto en el device y que lo haga 1000 veces  :(, la unica solucion es memorizar el evento en una variable y antes de agregar uno nuevo es eliminar el anterior aunque no exista

aprovechando el mismo hilo, ¿hay alguna manera de que el orden de creación de los objetos en el formulario se pueda escoger? es decir, me gustaria que se creara antes A, luego B, C, etc, pero claro tiene que ser en ese orden por que si no fallara y tenemos que andar editando cada dos por tres el designer.cs que crea automaticamente el .net, he probado el orden de tabulacion y no tiene nada que ver, he probado a crearlos en el orden logico y al final los pone como quiere

saludos

NeLo

 Tienes que modificar el código generado por el editor, para elegir el orden de creación. O crea los objetos tú mismo.

Yo en el curro trabajo bastante con objetos y controles propios, y mensajes y eventos, y los creo y destruyo todos yo mismo, cuando quiero y creo conveniente.

Cuanto menos dejes "al azar", mejor :P

Saludos.
Drowning deep in my sea of loathing

zupervaca

 ya pero cada vez que modifiques algo visualmente tienes que moverlo a una funcion tuya todo el tiempo por que el editor siempre te lo mete en la suya, ¿no hay algo menos fisico?

gdl

 No sé mucho de C# (leí el libro de González Seco hace un par de meses), pero supongo que habrá clausura del GC también para los eventos. Es decir, que eso de que "destruimos el objeto B" será más bien "le quito la última referencia que tengo al objeto B". Sin embargo, como hay otra referencia desde el evento hacia el objeto B, éste no se destruirá.

Voy a explicarme con flechitas para cada referencia,

Citartenemos dos objetos A y B
raíz -> A
raíz -> B

Citarentonces B agrega un evento en A
Pero el evento ha de guardar una referencia al objeto B (que luego será el this en el callback)

raíz -> A -> evento -> B
raíz -> B

Citardestruimos el objeto B
Sólo puedes quitar la referencia que posees (la de la raíz).

raíz -> A -> evento -> B


Sigue habiendo una referencia al objeto B a través del evento y el GC no debe reclamarlo. (Quizá es este el fallo que menciona Haddd si el GC lo reclamase. Por eso lo de mantener el KeepAlive)

Espero que tenga alguna lógica todo esto para vosotros....  :rolleyes:






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.