Самое распространённое решение этой проблемы:
1 Callback для таймера
Timer timer = new Timer(new TimerCallback(MyWorkCallback), HttpContext, 5000, 5000);
2 Поток в пул потоков
Thread thread = new Thread(Work);
thread.IsBackground = true;
thread.Start();
3 Собственно рабочий процесс
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(DoMyWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(DoMyWork_Completed);
worker.RunWorkerAsync();
4 Кэширование как здесь