none
Temporizador Global para ASP.NET MVC

    Pregunta

  • Tengo un temporizador global en el global.asax que funciona cuando inicia la aplicación, pero yo necesito un temporizador global que inicie cuando empieza la session despues de mi login, y no se como hacerlo, quisiera que me ayuden, que debo de cambiar en el global.asax o en donde lo debo hacer, gracias por la ayuda

     public class MvcApplication : System.Web.HttpApplication
        {
            static Timer timerGlobal = null;
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                RouteConfig.RegisterRoutes(RouteTable.Routes);
            }
            protected void Session_Start()
            {
                if (timerGlobal == null)
                {
     
                    Application.Lock();
                    Application["Contador"] = HttpContext.Current.Session.Timeout * 60;
                    Application.UnLock();


                    timerGlobal = new Timer(1000);
                    timerGlobal.Elapsed += new ElapsedEventHandler(ProcesoPeriodico);
                    timerGlobal.Start();
                    
                }
            }
            
            protected void ProcesoPeriodico(object sender, EventArgs e)
            {
                 Application.Lock();
                 int contador = (int)Application["Contador"];
                 Application["Contador"] = contador - 1;
                 Application.UnLock();
            }
        }

    jueves, 12 de julio de 2018 16:01

Todas las respuestas

  • Podrias crear el temporizador dentro del Session_Start y guardarlo en el objeto Session (siempre que la sesion sea "InProcess", dado que el timer no se puede serializar).

    Pero piensa en los problemas de escalado: Esto crea un timer por cada sesion que se conecte al servidor. Si tienes 1000 usuarios, se crearan 1000 timers. Y se dispararan 1000 copias del ProcesoPeriodico, y dado que el timer lo disparas una vez por segundo quiere decir que solo te queda una milesima de segundo de tiempo disponible para la ejecucion del proceso periodico.

    Aunque funcione en tiempo de desarrollo, con pocos usuarios, esto te dara infinidad de problemas en cuando pongas la aplicacion en produccion. Mas vale que replantees el diseño y busques una alternativa que no requiera un Timer por cada sesión. De hecho, en general es una pesima idea tener timers en el lado servidor de una aplicacion web. Piensa en que ocurrira cada vez que IIS haga el reciclado de la aplicacion, y en que ocurrira si tienes que hacer un escalado horizontal insatalando una granja de servidores. Plantea si lo deseas en un hilo del foro cual es la razon por la que quieres usar los timers, a ver si podemos encontrar una alternativa que no de problemas al pasar a produccion.

    jueves, 12 de julio de 2018 16:32
  • Lo que quiero hacer es un countdown global que al momento de iniciar la session vaya en cuenta regresiva hasta expirar la sesion. Supongamos que mi timeout esta en 20 minutos

    Por ejemplo si esta mi pagina en Home/Index, y supongamos que al momento de que mi contador esta en los ultimos 50 segundos al recargar la pag(F5) me debe seguir saliendo el mismo tiempo(50 segundos) y continuar con la cuenta regresiva y no volver los 20 minutos

    y tambien cuando voy a cambiar de Home/Index a Home/Contactos, debe de continuar el tiempo, no reiniciarse

    jueves, 12 de julio de 2018 16:59
  • Si he comprendido bien lo que quieres hacer, no se necesita un Timer para hacerlo. Al iniciar sesión, guarda simplemente la hora de inicio dentro del objeto Session. Y luego, en cada uno de los sitios donde quieres mostrar el contador, resta la hora actual menos la hora salvada. Eso te dice el tiempo que ha transcurrido desde el inicio.

    Si necesitas que mientras se visualiza la página el contador vaya contando, eso requiere un timer de lado cliente en javascript, no puedes conseguirlo mediante el Timer de lado servidor. Lo que harías es inicializar el valor a partir del que comienza a contar usando el cálculo antes mencionado.

    jueves, 12 de julio de 2018 18:14
  • El problema esque yo lo debo inicializar con el valor de session.timeout que puse en el web.config

    en mi caso para hacer pruebas lo pongo en 1 minuto, llamo a la session.timeout, lo convierto a segundos en un javascript y funciona mi contdown, el problema es cuando pasa a otra pagina que vuelve a ponerse en 60 segundos, y lo que quiero es que continue el countdown no que se reinicia, cuando faltan 20 segundos yo he puesto un popup que me diga si quiero mantener la sesion, si pongo si se reinicia el tiempo, si pongo no, continua hasta que expira la sesion

    Tambien lo hice con session.storage para guardar el valor y utilizarlo en la otra pagina, y me funciono bien, ya que para dirigirme a la otra pagina redireccionaba mediante un boton, pero si lo escribia en url no me funcionaba ya que se quedaba con el valor anterior 

    Soy principiante, recien estoy aprendiendo, necesito que ese countdown sea global, para mi session 

    lunes, 16 de julio de 2018 17:25