http://stackoverflow.com/questions/655012/what-are-some-best-practices-for-managing-background-threads-in-iis
If this is not an option, e. g. because you are in a shared hosting environment, I would recommend the following:

1. Start your background thread in Application_start (Global.asax), and store the thread reference in a static variable.
2. Wrap every method called on your background thread with try/catch, because since .NET 2.0, every unhandled exception on a background thread will shut down the application. (It will be restarted on the next request, but it slows down the next request, kills all current sessions and caches, and of course no timer will be active until the next request.)
3. On every request (implemented has a HttpModule or in Global.asax again), check the Thread instance in the global variable (is it still != null, is the thread active and running etc.). If not, call the restart code. Use locking in the restart part to make sure that the thread will not be created twice at same time.

http://stackoverflow.com/questions/390863/best-way-to-run-a-background-task-in-asp-net-web-app-and-also-get-feedback