none
SignalR, intervalo de tiempo, no funciona RRS feed

  • Question

  • Hola a todos.

    Tengo una aplicacion que usa SignalR.

    En la cual le defino el intervalo de tiempo en el cual va a estar checando en mi Base de Datos los cambios que yo requiera.

    Aqui el punto es que yo le defino 3 Segundos, pero en consola yo imprimo el tiempo que se esta consultando en la Base de datos, hay ocasiones donde si concuerda la diferencia de tiempo, pero en otras ocasiones no esta siendo asi,:

    Y a continuacion muestro donde defino el tiempo de intervalo.

            private readonly TimeSpan _updateInterval = TimeSpan.FromMilliseconds(3000);
    
            private ececStockTicker(IHubConnectionContext<dynamic> clients)
            {
    
                _timer = new Timer(UpdateData, null, _updateInterval, _updateInterval);
    
            }
    Pueden guiarme sobre a que se debe que puede estar ocurriendo?

    Wednesday, April 1, 2020 7:35 PM

Answers

All replies

  • hola

    >>Aqui el punto es que yo le defino 3 Segundos

    no crees que es un tiempo demasiado corto?

    ademas cuando se lanza el tiempo deberias detenerlo esperar que termine de procesar y prender el timer nuevamente, porque sino puede haber colisiones cuando un proceso previo aun no termino y se ejecuta otro

    >>Pueden guiarme sobre a que se debe que puede estar ocurriendo?

    lo que ocurre es que 3seg es muy poco tiempo para toda la operacion que quieres realizar

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Wednesday, April 1, 2020 9:04 PM
  • Si es poco tiempo, pero la razon por la que le defino ese intervalo, es porque deseo obtener informacion lo mas real posible.

    Voy a hacer pruebas al darle mas margen en el tiempo.

    Wednesday, April 1, 2020 9:10 PM
  • hola

    >>deseo obtener informacion lo mas real posible.

    pero no se fuerza de esa forma para lograr un real time

    No se de donde obtienes los datos, pero estos varian realmente cada 3seg? el real time se implementa cuando tienes un flujo de informacion, pero asi y todo se aplican ventanas de tiempo que el sistema pueda procesar

    No tiene sentido enviar datos cada 3seg si notas que estos generan superposiciones en la ejecucion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Wednesday, April 1, 2020 9:17 PM
  • En muchas ocasiones si hay cambios constantes cada 3 segundos o menos.

    Anteriormente lo tenia casi cada medio segundo, pero le he dado mas margen, ya que ultimamente al monitorear mi servidor, el procesador tiene mucho trabajo se pone incluso al tope de su rendimiento.

    O que otra opcion me recomienda?, lo que estoy realizando es darle mas tiempo para que poder realizar las operaciones que deseo.

    Wednesday, April 1, 2020 9:23 PM
  • Si estas revisando una base de datos podrias usar la clase

    SqlDependency

    para obtener un evento que informe cuando realmente hay una cambio y asi evitas el timer

    Detectar cambios con SqlDependency

    >>Anteriormente lo tenia casi cada medio segundo, pero le he dado mas margen

    ademas el tiempo real no suele implemetarse leyendo de una db porque esto es costoso, si analizas las estrategias por ejemplo que aplica Cloud como ser Azure se usan colas de mensajes

    Entonces la idea es que una actualizacion en la db pone un mensaje en la queue que otro proceso toma, agrupa segun cierta logica y al final informa, pero se separa la operacion transaccional de la informativa

    En cloud por ejemplo con eventos de lectura de dispositivos se envias a un Event Hub el cual se pasa por un Stream Analitics el cual permite definir una ventana en la cual genera un promedio de las lecturas y si la ventana es de 1min se informa el promedio de todas las lecturas paciales en ese tiempo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Wednesday, April 1, 2020 9:30 PM
  • Gracias lo checare
    Wednesday, April 1, 2020 9:49 PM
  • La aplicacion que tengo hecha es similar a este siguiente link:

    https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-server-broadcast-with-signalr

    Solo que no uso Core, y todo el proceso de intervalo de tiempo y la manera de consultar en la Base de Datos es lo que realizo.

    Wednesday, April 1, 2020 10:06 PM
  • ok veo

    pero ojo porque alli no asegura que los tiempos sean exactos porque si analizas UpdateStockPrices() ali usa el lock y eso hace que pueda ingresar varias llamadas pero no todas van a generar actualizaciones

    En ti caso pueden lanzar el timer cada 3seg pero no deberias esperar que las actualizaciones sean a intervalos exactos, porque pueden que se den dos llamadas de timer y solo se genera una sola actualizacion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Wednesday, April 1, 2020 11:07 PM
  • Gracias, de igual manera checare el articulo sobre SQL Dependency.

    Saludos.

    Thursday, April 2, 2020 2:38 AM
  • Que tal Leandro, he leido el articulo que me comentaste de SQL Dependency.

    He seguido los pasos del apartado de SqlDependency en una aplicacion ASP.NET.

    Pero no he conseguido recibir las actualizaciones.

    He dado los siguientes permisos para poder recibir notificaciones:

    GRANT CREATE QUEUE to [sql_dependency_starter]
    GRANT CREATE SERVICE to [sql_dependency_starter]
    GRANT REFERENCES on 
    CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]
      to [sql_dependency_starter] 
    GRANT VIEW DEFINITION TO [sql_dependency_starter] 
    En seguida puedo ver esto en Management Studio:

    Y el ejemplo que tome para realizar este ejercicio es el siguiente:

    https://docs.microsoft.com/es-es/dotnet/framework/data/adonet/sql/sqldependency-in-an-aspnet-app

    He seguido todos los pasos, cuando ejecuto el proyecto carga bien, pero al momento de hacer un cambio es donde no estoy recibiendo los cambios.

    Thursday, April 2, 2020 9:51 PM
  • hola

    Pero esa implementacion usa el SqlDependency junto al cache, lo que apuntaba era usar un evento

    Detectar cambios con SqlDependency

    entonces en el OnChange envias la notificacion por SignalR

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marked as answer by Pollokullos Wednesday, April 8, 2020 7:13 PM
    Friday, April 3, 2020 4:27 PM
  • Hola

    Logre hacer mi aplicacion con el ejercicio que me comentaste, ,las notificaciones se envian bien cuando hay un cambio en una tabla.

    El detalle que vi es si tengo abiertas 3 pestañas, es claro que se tienen que enviar las peticiones a los clientes conectados, es decir se llamara la funcion que devolvera los ultimos cambios que se hayan realizado, pero si vuelve a ver otro cambio, entonces la funcion no se llama 3 veces, se ejecuta mas de 5 veces, incluso hasta se llega a triplicar, eso a que puede deberse?

    Saludos.

    Sunday, April 5, 2020 2:57 AM
  • Hola , 

      

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las  respuestas proporcionadas?  

     

    Espero su respuesta. 

      

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN. 

      

    Oscar Navarro

      

     ____ 

      

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.   

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.    

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    Monday, April 6, 2020 4:46 PM
    Moderator