How to call function on timer ASP.NET MVC

devfreak picture devfreak · Dec 1, 2010 · Viewed 45.8k times · Source

I need to call function on timer (lets say onTickTack() function) and reload some info in ASP.NET MVC project. I know that there are several ways to do that, but which one is the best by your opinion?

Note: the function should be called from one place only, and should be called every X mins till application is up.

EDIT 1: Reload some info - for example I have something in the Cache and I want to update it from DB on timer - once a day in certain time.

Answer

Darin Dimitrov picture Darin Dimitrov · Dec 1, 2010

The answer to this question would very much depend on what do you mean by reload some info in ASP.NET MVC project. This is not a clearly stated problem and as such, more than obviously, it cannot have a clearly stated answer.

So if we assume that by this you want to periodically poll some controller action and update information on a view you could use the setInterval javascript function to periodically poll the server by sending an AJAX request and update the UI:

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);

If on the other hand you mean executing some task on the server at regular periods you could use the RegisterWaitForSingleObject method like this:

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
);

If you mean something else, don't hesitate to provide more details to your question.