Using Timer with Backgroundworker to ensure the doWork method is called
I needed something similar, in that I had code that was going to periodically check the database for new records and notify the user with baloon tips.  Checking the database every n-secs caused a pause in the UI that I didn't want the user to experience so I moved the procedure to a thread.

I had a System.Windows.Forms.Timer tick event, where the Thread was created something like (leaving out all the exception handling etc):

TIMER_TICK(object sender, EventArgs){
    Thread checkNow=new Thread(ProcessAutoCheck)
    checkNow.IsBackground=true;
    checkNow.Start();
    checkNow.Join(500);
}


Then in the ProcessAutoCheck method, I used the lock approach to prevent thread contention:

**lock**(lockObject){
{
....


The program worked as designed, and I didn't consume resources with threads.  It wasn't the fanciest solution.  I learned a lot from Threading in C# - By Joseph Albahari.  Complete book online.