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.
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.
You can use the Timer class in OnApplicationStart Event of 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
}
I do this by starting a worker thread from Application_Start().
Here's my class:
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;
}
It's started like this:
var backgroundThread = new Thread(Worker.DoWork)
{
IsBackground = true,
Name = "MyThread"
};
backgroundThread.Start();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With