none
Correr timer en un hilo distinto para evitar que se detenga por procesos que ocupen mucho tiempo en VB.Net

    Pregunta

  • Buenas tardes a todos, tengo una duda, estoy haciendo un pequeño programa, el cual trabajará con fechas, horas y minutos, la cuestion es que cuando inicio el programa lo primero que hago es consultar al Servidor MySQL la fecha y hora actual del Servidor, y lo almaceno en ese mismo momento en una variable DateTime, enseguida inicio un Timer con el método Start, el cual se encuentra a interválos mil milisegundos, y en cada Tick le agrega un segundo a la variable donde almacene desde un principio la fecha y hora del servidor con el método .AddSeconds(1) lo cual me da como resultado la hora actualizada sin tener que estar consultando al Servidor cada vez que necesite datos de fecha y hora. Todo bien hasta ahi. El problema es que he observado que cada vez que ejecuto algun procedimiento así tarde 1 o mas segundos detiene al timer que está generando constantemente la hora por lo que se va retrasando poco a poco la hora.

    Mi pregunta sería, hay alguna forma de iniciar y ejecutar el timer constantemente en un hilo totalmente independiente del resto de los procedimientos?

    De antemano muchas gracias por su ayuda.. Excelente tarde.


    Carlos

    jueves, 9 de febrero de 2017 17:24

Respuestas

  • Hola,

    Aunque hay mucha teoría al respecto el tema en concreto es muy simple, el pool de conexiones mantiene conexiones abiertas para atender a la brevedad cualquier petición de acceso a la base de datos.

    ¿Qué hay que hacer para que ello funcione? Pues nada, así se trabaja en default, claro que puedes aumentar/reducir o de plano restringir 0 conexiones abiertas disponibles. Cuando utilizas el método Open() de la clase MySqlConnection el pool de conexiones entrega una conexión abierta y a penas se cierra -la conexión- el pool de conexiones dispone sacarla del pool o mantenerla para una nueva petición.

    Te dejo unos enlaces para que lo revises:

    5.4 Using Connector/Net with Connection Pooling

    C# MySQL Connection Pooling


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 10 de febrero de 2017 21:11
  • Hola:

    Si me permites una sugerencia, yo evitaría totalmente el proceso en background para controlar la hora.

    Si lo que realmente y únicamente pretendes es 'saber la hora del servidor', y no estar constantemente llamando al servidor, yo probaría lo siguiente:

    ' Obtenemos el Desfase entre la hora del servidor y la hora de la máquina, la primera vez

    Public Desfase As TimeSpan = OBTENERLAHORADELSERVIDOR() - Now() ' La hora de la maquina.

    Y cuando necesites la hora del servidor, solo tienes que hacer una suma a la hora de la máquina.

    Dim HoraServidorActual As Date = Now() + Desfase

    Espero que te sirva.

    Un saludo


    viernes, 10 de febrero de 2017 11:21

Todas las respuestas

  • En lo personal yo mejor consultaba la hora del servidor cada vez en lugar de hacer un hilo para ese efecto.

    pero si te interesa crear un hilo para ese efecto te dejo un pequeño tutorial, aqui se habla de un ejemplo para llenar un DataTable que servira como DataSource a un DatgridView, pero igual lo puedes adaptar.

                                            

    primero agregar un BackgroundWorker al formulario

    '***en el clic del boton que llena la consulta y muestra el DatagridView


    If Me.BackgroundWorker1.IsBusy <> True Then
    Me.BackgroundWorker1.RunWorkerAsync()       
    End If



    '***en los eventos del backgrounworker

       Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            If Me.BackgroundWorker1.CancellationPending Then
                e.Cancel = True
            Else
                'funciones a procesar sin llamar ni modificar controles ya creados
                'por lo general es un reporte que llena una tabla

            End If
        End Sub


        Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
            If e.Cancelled Then
                'lo que se hace cuando se cancela el proceso
            Else
                'lo que se hace al terminar el proceso
                'por lo general es mostrar los datos en un datagrid y aqui va la linea que lo muestra con un datasource =
            End If
        End Sub

    Saludos

    Si te sirvio marcalo como respuesta


    jueves, 9 de febrero de 2017 19:56
  • Si, entiendo amigo. La cuestión por  la que prefiero almacenar la hora en mi programa es para evitar sobrecargar al Servidor cada vez que necesite la fecha y hora actual, el código que me enviaste habla de un background, pero no sé como hacer que el proceso en segundo plano vaya aumentando un segundo cada segundo valga la rebundancia a la variable donde almaceno mi fecha y hora del servidor.

    Se utilizar más o menos el background pero en esta ocasion no necesito mostrar nada en ningun control, solo necesito que cada segundo aumente un segundo la variable que almacena la fecha y hora del servidor, de manera que esten basicamente sincronizados.

    Entiendo que entre abrir y cerrar uno y otro form son milesimas de segundo pero hay procesos que tardar uno o dos segudos y se va acumulando y retrasando el timer, y he observado que despues de una hora ya tengo unos cinco minutos de diferencia respecto al servidor, y lo anterior por causa de que los timer se detienen cuando el hilo principal se usa.

    Y tampoco me es viable poner todos los procedimientos en segundo plano.

    Muchas gracias por tu respuesta.


    Carlos

    jueves, 9 de febrero de 2017 20:42
  • Hola:

    Si me permites una sugerencia, yo evitaría totalmente el proceso en background para controlar la hora.

    Si lo que realmente y únicamente pretendes es 'saber la hora del servidor', y no estar constantemente llamando al servidor, yo probaría lo siguiente:

    ' Obtenemos el Desfase entre la hora del servidor y la hora de la máquina, la primera vez

    Public Desfase As TimeSpan = OBTENERLAHORADELSERVIDOR() - Now() ' La hora de la maquina.

    Y cuando necesites la hora del servidor, solo tienes que hacer una suma a la hora de la máquina.

    Dim HoraServidorActual As Date = Now() + Desfase

    Espero que te sirva.

    Un saludo


    viernes, 10 de febrero de 2017 11:21
  • Jejeje es exactamente lo que hice después de hacer la última pregunta aquí. Te agradezco amigo. Que tengas un excelnte día.

    Carlos

    viernes, 10 de febrero de 2017 15:59
  • ¿Tienes certeza de que el usuario que ejecuta la aplicación tiene restringido actualizar la fecha y hora?

    Por otro lado, el pool de conexiones permite que los accesos a la base de datos sean inmediatos y sin mayor coste porque no hay necesidad de abrir una nueva conexión sino que se toma una disponible, en ese contexto no deberías tener problemas en acceder a la base de datos y tomar un valor escalar y que eso signifique problemas en el rendimiento.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 10 de febrero de 2017 17:52
  • Jeje soy principiante, me podrías explicar como funciona el pool de conexiones MySQL?.


    Carlos

    viernes, 10 de febrero de 2017 19:26
  • Hola,

    Aunque hay mucha teoría al respecto el tema en concreto es muy simple, el pool de conexiones mantiene conexiones abiertas para atender a la brevedad cualquier petición de acceso a la base de datos.

    ¿Qué hay que hacer para que ello funcione? Pues nada, así se trabaja en default, claro que puedes aumentar/reducir o de plano restringir 0 conexiones abiertas disponibles. Cuando utilizas el método Open() de la clase MySqlConnection el pool de conexiones entrega una conexión abierta y a penas se cierra -la conexión- el pool de conexiones dispone sacarla del pool o mantenerla para una nueva petición.

    Te dejo unos enlaces para que lo revises:

    5.4 Using Connector/Net with Connection Pooling

    C# MySQL Connection Pooling


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 10 de febrero de 2017 21:11
  • Muchas gracias por tu respuesta. Me has ayudado un buen. Saludos

    Carlos

    viernes, 10 de febrero de 2017 21:42