2010-12-01 15 views
10

Necesito llamar a la función del temporizador (digamos en la función TickTack()) y volver a cargar cierta información en el proyecto ASP.NET MVC. Sé que hay varias formas de hacerlo, pero ¿cuál es el mejor según tu opinión?Cómo llamar a la función en el temporizador ASP.NET MVC

Nota: la función debe llamarse desde un solo lugar, y se debe llamar cada X minutos hasta que la aplicación esté activa.

EDITAR 1: Recargar alguna información, por ejemplo, tengo algo en la memoria caché y quiero actualizarlo desde la base de datos en el temporizador, una vez al día en un momento determinado.

+2

necesitamos más detalles sobre lo que está tratando de hacer – rboarman

+0

¿Puede enumerado las varias maneras para que podamos dar nuestra opinión? –

+0

¿Por qué no una aplicación por separado? –

Respuesta

24

La respuesta a esta pregunta dependerá mucho de lo qué se refiere con recargar algo de información en ASP.NET Proyecto MVC. Este no es un problema claramente establecido y, como tal, más que obviamente, no puede tener una respuesta claramente establecida.

lo tanto, si suponemos que por este que desea sondear periódicamente alguna acción del controlador y actualizar la información en una vista que se podría utilizar el setInterval función javascript para sondear periódicamente el servidor mediante el envío de una petición AJAX y actualizar la interfaz de usuario:

window.setInterval(function() { 
    // Send an AJAX request every 5s to poll for changes and update the UI 
    // example with jquery: 
    $.get('/foo', function(result) { 
     // TODO: use the results returned from your controller action 
     // to update the UI 
    }); 
}, 5000); 

Si por el contrario te refieres a la ejecución de alguna tarea en el servidor a intervalos regulares se puede utilizar el método de RegisterWaitForSingleObject así:

var waitHandle = new AutoResetEvent(false); 
ThreadPool.RegisterWaitForSingleObject(
    waitHandle, 
    // Method to execute 
    (state, timeout) => 
    { 
     // TODO: implement the functionality you want to be executed 
     // on every 5 seconds here 
     // Important Remark: This method runs on a worker thread drawn 
     // from the thread pool which is also used to service requests 
     // so make sure that this method returns as fast as possible or 
     // you will be jeopardizing worker threads which could be catastrophic 
     // in a web application. Make sure you don't sleep here and if you were 
     // to perform some I/O intensive operation make sure you use asynchronous 
     // API and IO completion ports for increased scalability 
    }, 
    // optional state object to pass to the method 
    null, 
    // Execute the method after 5 seconds 
    TimeSpan.FromSeconds(5), 
    // Set this to false to execute it repeatedly every 5 seconds 
    false 
); 

Si quieres decir algo más, no Hesi para proporcionar más detalles a su pregunta.

+1

Gracias el segundo funciona perfectamente en mi caso EDIT 1 – devfreak

+0

+1 para la compleción de la explicación y la advertencia de rendimiento – devfreak

+0

@Darin, quiero enviar un correo cuando la hora es 4 pm y cuando una fila de la base de datos cambia, ¿hay una manera simple sin usar Signal R?, cualquier ayuda sería genial. – stom

1

Lo hago al iniciar un hilo de trabajo desde Application_Start().

Aquí es mi clase:

public interface IWorker 
{ 
    void DoWork(object anObject); 
} 

public enum WorkerState 
{ 
    Starting = 0, 
    Started, 
    Stopping, 
    Stopped, 
    Faulted 
} 

public class Worker : IWorker 
{ 
    public WorkerState State { get; set; } 

    public virtual void DoWork(object anObject) 
    { 
     while (!_shouldStop) 
     { 
      // Do some work 
      Thread.Sleep(5000); 
     } 

     // thread is stopping 
     // Do some final work 
    } 

    public void RequestStop() 
    { 
     State = WorkerState.Stopping; 
     _shouldStop = true; 
    } 
    // Volatile is used as hint to the compiler that this data 
    // member will be accessed by multiple threads. 
    protected volatile bool _shouldStop; 
} 

Se comenzó así:

 var backgroundThread = new Thread(Worker.DoWork) 
            { 
             IsBackground = true, 
             Name = "MyThread" 
            }; 
     backgroundThread.Start(); 
11

Puede utilizar la clase Timer en OnApplicationStart caso de Glbal.asax ...

public static System.Timers.Timer timer = new System.Timers.Timer(60000); // This will raise the event every one minute. 
. 
. 
. 

timer.Enabled = true; 
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); 
. 
. 
. 

static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    // Do Your Stuff 
} 
0

Mi solución es de esta manera;

<script type="text/javascript"> 
    setInterval(
     function() 
     { 
      $.post("@Url.Action("Method", "Home")", {}, function (data) { 
       alert(data); 
      }); 
     }, 5000) 
</script> 

Método llamado;

[HttpPost] 
public ActionResult Method() 
{ 
    return Json("Tick"); 
} 
Cuestiones relacionadas