Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET MVC Repeating Task

I need to run a task repeatedly on an ASP.NET MVC site; it needs to run every time interval (Interval doesn't matter).

I achieved this by setting a background thread from the Global.asax.cs Application_Start which runs the task, sleeps for time interval and then runs again....and again.

While this works it doesn't seem like the right way to do this, seems a bit hacky.

So then I replaced it with a Timer object, this doesn't work reliably - seems others have had problems with it as well - so I'm not going to use this.

This needs to run in the MVC site, it is used for pulling jobs from a queue and rendering them from the Views ready for emailing.

I thought about using the ThreadPool and getting the previous job to leave another job on it's way out but because these can be long running jobs I've read that this can end up not leaving enough threads to deal with web requests through starvation.

Before sticking with the original thread method I thought I'd ask if anyone else knows a better way of doing this.

I hope this makes sense. Effectively what I'm trying to achieve is a heartbeat. Something to act as the consumer part of the producer/consumer pattern in an MVC site.

like image 624
Craig Norton Avatar asked Jun 27 '11 10:06

Craig Norton


1 Answers

Stackoverflow itself uses (or at least used to use) a cunning way of doing this. See here: https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

In brief, you do this:

  1. At startup, add an item to the HttpRuntime.Cache with a fixed expiration.

  2. When cache item expires, do your work, such as WebRequest or what have you.

  3. Re-add the item to the cache with a fixed expiration.

like image 161
Tom Chantler Avatar answered Oct 26 '22 14:10

Tom Chantler