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
 

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


Preguntas similares