Timer Asincrono

05/04/2006 - 23:47 por Diego Cofré | Informe spam
Hola Grupo:
Tengo el siguiente problema. Mi aplicacion tiene un timer que hace ping al
servidor para que este sepa cuales clientes siguen conectados. La idea es
que si los clientes no hacen ping al servidor en un intervalo de tiempo,
este los considera desconectados y los limpia del sistema.
El problema es que muchas veces los clientes hacen procesos largos, en
general se trata de esperas a algun commando de la db que tarda mucho en
ejecutarse, y estos que impiden que el evento tick del timer se dispare, con
lo cual el servidor los desconecta impiadosamente.
¿Hay alguna forma de hacer que el evento tick se dispare siempre,
independientemente de si el cliente esta en espera de una respuesta de la
db? ¿Algo asi como un timer asincronico, que funcione en un thread aparte?

Agradezco sus ideas.

Saludos
Lic. Diego Cofré
Desarrollador
EWAVE GROUP S.A
www.e-wavegroup.com

Preguntas similare

Leer las respuestas

#1 Jesús López
06/04/2006 - 09:26 | Informe spam
Tienes tres clases Timer en la .NET Framework:

System.Threading.Timer
System.Timers.Timer
System.Windows.Forms.Timer

Supongo que el que estás usando es el de Windows Forms. Cualquiera de los
otros dos podría servirte.

Tu problema tiene varias soluciones. Una de ellas, bastante obvia por
cierto, es incremetar el tiempo que el servidor espera sin recibir noticias
para dar por inactivo un cliente. ¿Por qué tanta prisa en desconectar
clientes inactivos?. No creo que se vaya a romper nada porque el servidor
espere 5 ó 10 minutos más. Otra solución es que los procesos largos que
hagan los clientes los realicen de forma asíncrona, así no se quedan
bloqueados y siguen enviando pings al servidor mientras tanto. La
programación asíncrona puede realizarse por medio de hilos, delegados
asíncronos y el nuevo modelo de programación asíncrona de la .NET Fx 2.0
que incluye el componente BackgroundWorker. Otra solución es arrancar un
hilo en background al inicio de la aplicación que, cada cierto tiempo envíe
el ping al servidor, pero para esto no es necesario un timer, con usar
Thread.Sleep es suficiente. Por ejemplo:

Dim t As New Thread(AddressOf Notificar)
t.IsBackground = True
t.Start()


Private Sub Notificar()
Dim intervalo As New TimeSpan(0, 5, 0)
While True
Thread.Sleep(intervalo)
Ping()
End While
End Sub

Es importante poner la propiedad t.IsBackground, porque así el hilo
finalizará automáticamente cuando se cierre la aplicación.

Saludos:

Jesús López




"Diego Cofré" escribió en el mensaje
news:
Hola Grupo:
Tengo el siguiente problema. Mi aplicacion tiene un timer que hace ping al
servidor para que este sepa cuales clientes siguen conectados. La idea es
que si los clientes no hacen ping al servidor en un intervalo de tiempo,
este los considera desconectados y los limpia del sistema.
El problema es que muchas veces los clientes hacen procesos largos, en
general se trata de esperas a algun commando de la db que tarda mucho en
ejecutarse, y estos que impiden que el evento tick del timer se dispare,
con
lo cual el servidor los desconecta impiadosamente.
¿Hay alguna forma de hacer que el evento tick se dispare siempre,
independientemente de si el cliente esta en espera de una respuesta de la
db? ¿Algo asi como un timer asincronico, que funcione en un thread aparte?

Agradezco sus ideas.

Saludos
Lic. Diego Cofré
Desarrollador
EWAVE GROUP S.A
www.e-wavegroup.com


Respuesta Responder a este mensaje
#2 Diego Cofré
06/04/2006 - 17:34 | Informe spam
Muchas gracias por tu respuesta Jesus, me gusto la ultima, es concisa y
eficiente.

Saludos
Diego
Respuesta Responder a este mensaje
#3 Jesús López
06/04/2006 - 19:23 | Informe spam
De nada. A mi también es la que más me gusta, sin embargo, elegir esta
solución no quita para implementar ejecución asíncrona en los procesos
largos. Esto aumenta la calidad de la aplicación al no quedarse bloqueada en
ningún momento. Por otra parte no has respondido a mi pregunta ¿por qué
darse tanta prisa en desconectar a los clientes inactivos?. Lo preguntaba
también porque da la sensación de que el servidor hace un barrido cada poco
tiempo. Quizá este tiempo podría incrementarse sin perder nada apenas y sin
embargo con esto se reduce la carga del servidor.

Saludos:

Jesús López


"Diego Cofré" escribió en el mensaje
news:
Muchas gracias por tu respuesta Jesus, me gusto la ultima, es concisa y
eficiente.

Saludos
Diego


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